我正在尝试将大型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))
运行它会将0作为filesize打印大约80次迭代,然后打印4176.在实际输出之前,Python是否将输出存储在缓冲区中?
答案 0 :(得分:11)
文件大小与文件位置不同。例如,
os.path.getsize('sample.txt')
它以字节为单位返回文件大小。
但是
f = open('sample.txt')
print f.readline()
f.tell()
这里f.tell()返回文件处理程序的当前位置 - 即下一次写入将放置其数据的位置。由于它知道缓冲,只要你只是附加到输出文件就应该是准确的。
答案 1 :(得分: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))
(这可能不是100%准确,例如。在Windows上,由于\r\n
行分隔符,每一行都会获得一个字节,但它应该足以进行简单的分块。)
答案 2 :(得分:5)
您是否尝试将os.path.getsize替换为os.tell,如下所示:
f2.write(line)
size = f2.tell()
答案 3 :(得分:4)
自己跟踪尺寸对您的情况很好。另一种方法是在检查大小之前刷新文件缓冲区:
f2.write(line)
f2.flush() # <-- buffers are written to disk
size = os.path.getsize('split.xml')
当然,经常这样做会减慢文件I / O.
答案 4 :(得分:1)
要查找文件末尾的偏移量:
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