[python] 파이썬으로 큰 텍스트 파일을 메모리에로드하지 않고 한 줄씩 읽을 수 있습니까?

큰 파일을 한 줄씩 읽어야합니다. 파일에 5GB 이상이 있고 각 줄을 읽어야한다고 말하지만 분명히 readlines()메모리에 매우 큰 목록을 생성 하기 때문에 사용하고 싶지 않습니다 .

이 경우 아래 코드가 어떻게 작동합니까? 되어 xreadlines자체 메모리에 하나 하나 읽어? 생성기 표현식이 필요합니까?

f = (line for line in open("log.txt").xreadlines())  # how much is loaded in memory?

f.next()  

또한 Linux tail명령 과 마찬가지로 이것을 역순으로 읽으려면 어떻게해야 합니까?

나는 찾았다 :

http://code.google.com/p/pytailer/

파이썬 헤드, 테일 및 텍스트 파일의 행으로 뒤로 읽음

둘 다 잘 작동했습니다!



답변

Keith는 간결하면서 파일을 명시 적으로 닫지 않기 때문에이 답변을 제공했습니다.

with open("log.txt") as infile:
    for line in infile:
        do_something_with(line)


답변

파일 객체를 반복자로 사용하기 만하면됩니다.

for line in open("log.txt"):
    do_something_with(line)

최신 Python 버전에서 컨텍스트 관리자를 사용하는 것이 더 좋습니다.

with open("log.txt") as fileobject:
    for line in fileobject:
        do_something_with(line)

파일도 자동으로 닫힙니다.


답변

구식 접근 방식 :

fh = open(file_name, 'rt')
line = fh.readline()
while line:
    # do stuff with line
    line = fh.readline()
fh.close()


답변

대신 이터레이터를 사용하는 것이 좋습니다. 관련 : http://docs.python.org/library/fileinput.html

문서에서 :

import fileinput
for line in fileinput.input("filename"):
    process(line)

이렇게하면 전체 파일을 한 번에 메모리에 복사하지 않아도됩니다.


답변

파일에 줄 바꿈이없는 경우 수행 할 작업은 다음과 같습니다.

with open('large_text.txt') as f:
  while True:
    c = f.read(1024)
    if not c:
      break
    print(c)


답변

이것을 시도하십시오 :

with open('filename','r',buffering=100000) as f:
    for line in f:
        print line


답변

@ john-la-rooy의 대답처럼 쉽게 보일 수 있다고 생각할 수 없었습니다. 그래서 cp한 줄씩 읽고 쓰는 명령을 다시 작성했습니다. CRAZY FAST입니다.

#!/usr/bin/env python3.6

import sys

with open(sys.argv[2], 'w') as outfile:
    with open(sys.argv[1]) as infile:
        for line in infile:
            outfile.write(line)