Giải pháp
Module linecache triển khai bộ nhớ đệm (cache) lưu trữ nội dung file, được phân tích thành các dòng riêng biệt, trong bộ nhớ. Module trả về dòng/dòng bằng cách lập chỉ mục vào danh sách, tiết kiệm thời gian so với việc đọc file và phân tích dòng lặp lại để tìm dòng mong muốn.
linecache rất hữu ích khi cần truy xuất nhiều dòng từ cùng một file.
Chuẩn bị dữ liệu kiểm tra
Sử dụng văn bản Lorem Ipsum mẫu (tìm trên Google).
Ví dụ hoàn chỉnh
import os
import tempfile
import linecache
text = """Lorem ipsum dolor sit amet, causae apeirian ea his...
... (nội dung dài, nhiều dòng) ..."""
def make_tempfile():
""" Tạo file tạm thời. """
directory = os.getcwd()
fd, temp_file = tempfile.mkstemp(dir=directory)
os.close(fd)
with open(temp_file, 'wt') as f:
f.write(text)
return temp_file
def cleanup(temp_file):
os.unlink(temp_file)
# Tạo file tạm với dữ liệu
filename = make_tempfile()
print(f"Output \n {filename}")
split_line = '\n'
# Lấy dòng thứ 5 trực tiếp từ nguồn (index 4 vì list bắt đầu từ 0)
print(f"*** Hiển thị dòng 5 trực tiếp từ nguồn \n {text.split(split_line)[4]}")
# Lấy dòng thứ 5 từ cache (linecache đánh số từ 1)
print(f" \n *** Hiển thị dòng 5 từ cache \n {linecache.getline(filename, 5)}")
# Dọn dẹp file tạm
cleanup(filename)
Kết quả: Cả hai cách đều trả về cùng một dòng.
Lưu ý quan trọng
- Đánh số dòng:
linecacheđánh số dòng bắt đầu từ 1, khác với list Python bắt đầu từ 0. - Ký tự xuống dòng:
linecacheluôn bao gồm ký tự newline ở cuối dòng. Nếu dòng trống, giá trị trả về chỉ là ký tự newline ('\n').
Ví dụ dòng trống
import linecache
filename = make_tempfile()
print(f"Output \n {filename}")
print(f"\n *** Số dòng trong văn bản là 13.")
print(f" \n *** Dòng cuối từ Linecache (phải là newline) \n {!r}".format(linecache.getline(filename, 8)))
cleanup(filename)
Kết quả: '\n'
Kết luận
Khi ứng dụng cần truy cập ngẫu nhiên (random access) vào các dòng của file, linecache giúp đọc dòng theo số dòng dễ dàng. Nội dung file được giữ trong cache, do đó cần cẩn thận về tiêu thụ bộ nhớ.