특히 만족스러운 답변은 없으므로 여기에 도움이 될 작은 스 니펫이 있습니다.
class LineSeekableFile:
def __init__(self, seekable):
self.fin = seekable
self.line_map = list() # Map from line index -> file position.
self.line_map.append(0)
while seekable.readline():
self.line_map.append(seekable.tell())
def __getitem__(self, index):
# NOTE: This assumes that you're not reading the file sequentially.
# For that, just use 'for line in file'.
self.fin.seek(self.line_map[index])
return self.fin.readline()
사용 예 :
In: !cat /tmp/test.txt
Out:
Line zero.
Line one!
Line three.
End of file, line four.
In:
with open("/tmp/test.txt", 'rt') as fin:
seeker = LineSeekableFile(fin)
print(seeker[1])
Out:
Line one!
여기에는 많은 파일 검색이 포함되지만 전체 파일을 메모리에 맞출 수없는 경우에 유용합니다. 라인 위치를 얻기 위해 한 번의 초기 읽기를 수행하고 (따라서 전체 파일을 읽지 만 메모리에 모두 보관하지는 않음) 각 액세스는 사실을 추적하여 파일을 찾습니다.
사용자의 재량에 따라 MIT 또는 Apache 라이선스에 따라 위의 스 니펫을 제공합니다.