写入文件后,为什么os.path.getsize仍返回之前的大小?
我正在尝试把一个很大的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
作为换行符,但对于简单的分块处理来说,这应该足够用了。)