写入文件后,为什么os.path.getsize仍然返回以前的大小?

Mau*_*lin 13 python filesize

我试图将一个大的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))
Run Code Online (Sandbox Code Playgroud)

运行此命令将打印0作为文件大小进行约80次迭代,然后打印4176.在实际输出之前,Python是否将输出存储在缓冲区中?

Sri*_*ram 11

文件大小与文件位置不同.例如,

os.path.getsize('sample.txt') 
Run Code Online (Sandbox Code Playgroud)

它以字节为单位返回文件大小.

f = open('sample.txt')
print f.readline()
f.tell() 
Run Code Online (Sandbox Code Playgroud)

这里f.tell()返回文件处理程序的当前位置 - 即下一次写入将放置其数据的位置.因为它知道缓冲,所以只要你只是附加到输出文件就应该是准确的.


Ric*_*dle 10

是的,Python正在缓冲你的输出.你最好自己跟踪尺寸,如下所示:

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

(这可能不是100%准确,例如在Windows上,由于\r\n行分隔符,每行会获得一个字节,但它应该足够简单的分块.)


Pio*_*pla 5

您是否尝试将os.path.getsize替换为os.tell,如下所示:

f2.write(line)
size = f2.tell()
Run Code Online (Sandbox Code Playgroud)