이 질문에 대한 답변은 이미 here과 here입니다.파이썬 3에서 대용량 파일의 첫 줄을 효과적으로 제거하는 방법은 무엇입니까?
첫 번째 줄을 파이썬 3에서 큰 파일에서 효율적으로 제거하려면 어떻게합니까?
로깅이 필요한 프로그램을 작성 중이며 로그 파일의 최대 크기는 무한대로 구성 할 수 있습니다. 따라서 나는 이것들이 메모리 집약적 인 것처럼 readlines()
또는 유사한 방법을 사용하고 싶지 않습니다. 속도는 큰 문제는 아니지만, 없이 파일을 다시 작성하고 임시 파일없이 파일을 다시 작성하면 큰 효과가 있습니다.
솔루션은 크로스 플랫폼이어야합니다.
예 로그 파일 :
[09:14:56 07/04/17] [INFO] foo
[23:45:01 07/04/17] [WARN] bar
[13:45:28 08/04/17] [INFO] foobar
... many thousands more lines
출력 : 다음 해결 방법 중
while os.path.getsize(LOGFILE) > MAXLOGSIZE:
# remove first line of file
를 수행해도 문제가 해결되지 않는 메모리입니다
:이 코드는 루프에서 실행됩니다[23:45:01 07/04/17] [WARN] bar
[13:45:28 08/04/17] [INFO] foobar
... many thousands more lines
효율적인 :
솔루션 # 1 - 작동하지만 비효율적 인은
with open('file.txt', 'r') as fin:
data = fin.read().splitlines(True)
with open('file.txt', 'w') as fout:
fout.writelines(data[1:])
# 2 솔루션 - 작동하지 않습니다는 빈 파일
import shutil
source_file = open('file.txt', 'r')
source_file.readline()
target_file = open('file.txt', 'w')
shutil.copyfileobj(source_file, target_file)
솔루션 # 3 잎 - 작품, 효율적인하지만, 추가 파일을 사용
with open("file.txt",'r') as f:
with open("new_file.txt",'w') as f1:
f.next() # skip header line
for line in f:
f1.write(line)
광범위한 테스트를 거친 후 100 % 시간이 걸리는 것 같습니다. 코드에서 옳은 말을하는 것처럼 보입니다. 신뢰할 수 없게 행동해야합니다. 그러나 예기치 않은 신뢰성은 나에게 좋았다! – retnikt
@retnikt 선 길이를 적용하면 (끝까지 도달하지 못하면 채우기가 끝나고 새 선이 생깁니다) 신뢰할 수있는 동작을 얻을 수 있습니다. 그보다 더 큰 문제가있을 수 있습니다 –
len> 200에 대한 매우 긴 행이 있고 이전에 하나의 문자 만 포함 된 100 개의 행이 있다고 가정합니다 (예 : new - 라인), 그러면 실패 할 것이고, 유쾌하지는 않을 것이다. –