Python 写入文件后,为什么os.path.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':

我正在尝试将一个大的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))
导入字符串
导入操作系统
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%准确。