파일에 작성한 후 os.path.getSize가 여전히 이전 크기를 반환하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1013778

  •  06-07-2019
  •  | 
  •  

문제

큰 XML 파일을 작은 청크로 분할하려고합니다. 출력 파일에 작성한 다음 크기가 임계 값을 전달했는지 확인하지만 getsize () 메소드가 예상대로 작동한다고 생각하지 않습니다.

크기가 변경되는 파일의 파일 크기를 얻는 좋은 방법은 무엇입니까?

나는 이런 일을했다 ...

import string
import os

f1 = open('VSERVICE.xml', 'r')
f2 = open('split.xml', 'w')

for line in f1:
  if str(line) == '</Service>\n':
    break
  else:
    f2.write(line)
    size = os.path.getsize('split.xml')
    print('size = ' + str(size))

이 인쇄물 0을 약 80 개의 반복으로 파일 크기로 실행 한 다음 4176. Python은 실제로 출력하기 전에 버퍼에 출력을 저장합니까?

도움이 되었습니까?

해결책

예, Python은 출력을 버리고 있습니다. 크기를 스스로 추적하는 것이 더 나을 것입니다.

size = 0
for line in f1:
  if str(line) == '</Service>\n':
    break
  else:
    f2.write(line)
    size += len(line)
    print('size = ' + str(size))

(100% 정확하지 않을 수 있습니다. 예를 들어, 창에서 각 라인은 \r\n 라인 분리기이지만 간단한 청크를하기에 충분해야합니다.)

다른 팁

파일 크기는 파일 위치와 다릅니다. 예를 들어,

os.path.getsize('sample.txt') 

파일 크기를 바이트로 정확히 반환합니다.

하지만

f = open('sample.txt')
print f.readline()
f.tell() 

여기서 f.tell ()은 파일 핸들러의 현재 위치를 반환합니다. 즉, 다음 write가 데이터를 넣습니다. 버퍼링을 알고 있으므로 출력 파일에 단순히 추가되는 한 정확해야합니다.

os.path.getSize를 OS.Tell으로 바꾸려고 했습니까?

f2.write(line)
size = f2.tell()

크기를 직접 추적하는 것은 당신의 경우에도 괜찮을 것입니다. 다른 방법은 크기를 확인하기 직전에 파일 버퍼를 플러시하는 것입니다.

f2.write(line)
f2.flush()  # <-- buffers are written to disk
size = os.path.getsize('split.xml')

물론 파일 I/O 속도가 느려질 것입니다.

파일 끝까지 오프셋을 찾으려면 다음과 같습니다.

file.seek(0,2)
print file.tell()

실제 예제 - 파일에 대한 업데이트를 읽고 일어날 때 인쇄하십시오.

file = open('log.txt', 'r')
#find inital End Of File offset
file.seek(0,2)
eof = file.tell()
while True:
    #set the file size agian
    file.seek(0,2)
    neweof = file.tell()
    #if the file is larger...
    if neweof > eof:
        #go back to last position...
        file.seek(eof)
        # print from last postion to current one
        print file.read(neweof-eof),
        eof = neweof
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top