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

13 投票
5 回答
26152 浏览
提问于 2025-04-15 12:20

我正在尝试把一个很大的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))

运行这个代码大约打印了80次文件大小为0,然后才显示4176。难道Python在真正输出之前会把内容先存储在一个缓冲区里吗?

5 个回答

5

你有没有试过把 os.path.getsize 替换成 os.tell,像这样:

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

文件大小和文件位置是两回事。举个例子,

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

这个代码会准确返回文件的大小,单位是字节。

但是

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

这里的 f.tell() 是用来获取文件指针的当前位置,也就是下一次写入数据时会放到哪里。由于它知道缓冲区的情况,只要你只是往输出文件追加内容,这个位置是准确的。

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))

(这可能不是百分之百准确,比如在Windows上,每行会多一个字节,因为使用了\r\n作为换行符,但对于简单的分块处理来说,这应该足够用了。)

撰写回答