Python 写入文件后,为什么os.path.getsize仍然返回以前的大小?
我正在尝试将一个大的xml文件拆分成更小的块。我写入输出文件,然后检查它的大小,看它是否超过了阈值,但我认为getsize()方法没有按预期工作 获取大小正在更改的文件的文件大小的好方法是什么 我做过这样的事Python 写入文件后,为什么os.path.getsize仍然返回以前的大小?,python,filesize,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':
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))
导入字符串
导入操作系统
f1=打开('VSERVICE.xml','r')
f2=打开('split.xml','w')
对于f1中的行:
如果str(line)='\n':
打破
其他:
f2.写入(行)
size=os.path.getsize('split.xml')
打印(“大小=”+str(大小))
运行此命令会将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))
f2.write(line)
size = f2.tell()
size=0
对于f1中的行:
如果str(line)='\n':
打破
其他:
f2.写入(行)
尺寸+=透镜(线)
打印(“大小=”+str(大小))
(这可能不是100%准确,例如,在Windows上,由于使用了
\r\n
行分隔符,每行将增加一个字节,但对于简单的分块来说应该足够了。)您自己跟踪大小就可以了。另一种方法是在检查大小之前刷新文件缓冲区:
f2.write(line)
f2.flush() # <-- buffers are written to disk
size = os.path.getsize('split.xml')
f2.写入(行)
f2.flush()#您是否尝试过用os.tell替换os.path.getsize,如下所示:
size = 0
for line in f1:
if str(line) == '</Service>\n':
break
else:
f2.write(line)
size += len(line)
print('size = ' + str(size))
f2.write(line)
size = f2.tell()
文件大小与文件位置不同。比如说,
os.path.getsize('sample.txt')
它以字节为单位精确返回文件大小
但是
这里f.tell()返回文件处理程序的当前位置,即下一次写入将把数据放在哪里。因为它知道缓冲,所以只要您只是简单地附加到输出文件,它就应该是准确的。要查找文件末尾的偏移量,请执行以下操作:
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
谢谢这应该行得通。我不需要它是100%准确。