โซลูชัน
โมดูล linecache ใช้แคช (cache) เก็บเนื้อหาไฟล์ แยกเป็นบรรทัดแยกกัน ในหน่วยความจำ linecache คืนค่าบรรทัดโดยการ indexing เข้า list ประหยัดเวลา ไม่ต้องอ่านไฟล์และ parse บรรทัดซ้ำๆ
linecache เหมาะสำหรับการเข้าถึงหลายบรรทัดจากไฟล์เดียวกัน
เตรียมข้อมูลทดสอบ
สร้างไฟล์ชั่วคราวด้วยข้อความ Lorem Ipsum หลายบรรทัด
ตัวอย่างโค้ด
import os
import tempfile
import linecache
text = """Lorem ipsum dolor sit amet, causae apeirian ea his...
... (ข้อความยาวหลายบรรทัด) ..."""
def make_tempfile():
"""Create a temporary file."""
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)
# สร้างไฟล์ชั่วคราว
filename = make_tempfile()
print(f"Output \n {filename}")
split_line = '\n'
# ดึงบรรทัดที่ 5 จาก source โดยตรง
print(f"*** Displaying first 5 lines directly from the source \n {text.split(split_line)[4]}")
# ดึงบรรทัดที่ 5 จาก cache (linecache เริ่มนับที่ 1 ไม่ใช่ 0)
print(f" \n *** Displaying first 5 lines from the cache \n {linecache.getline(filename, 5)}")
# ลบไฟล์ชั่วคราว
cleanup(filename)
ผลลัพธ์: ทั้งสองวิธีให้บรรทัดที่ 5 เหมือนกัน
ข้อสังเกตสำคัญ
- Line numbers เริ่มที่ 1 ไม่ใช่ 0 เหมือน list ปกติ
linecache.getline()จะรวม newline (\n) ไปด้วยเสมอ หากบรรทัดว่าง จะคืนค่าแค่'\n'
# ตัวอย่างบรรทัดว่าง
print(linecache.getline(filename, 8)) # คืนค่า '\n'
สรุป
เมื่อแอปพลิเคชันต้องการ random access ไปยังไฟล์ linecache ทำให้อ่านบรรทัดตามหมายเลขได้ง่าย เนื้อหาไฟล์ถูกเก็บในแคช จึงต้องระวังการใช้หน่วยความจำ