13

我正在尝试将大型 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 作为文件大小进行大约 80 次迭代,然后打印 4176。Python 是否在实际输出之前将输出存储在缓冲区中?

4

5 回答 5

11

文件大小与文件位置不同。例如,

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

它以字节为单位准确返回文件大小。

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

这里 f.tell() 返回文件处理程序的当前位置 - 即下一次写入将放置其数据的位置。由于它知道缓冲,因此只要您只是附加到输出文件,它就应该是准确的。

于 2011-04-28T16:22:11.137 回答
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行分隔符,每行都会增加一个字节,但对于简单的分块来说应该足够了。)

于 2009-06-18T16:41:16.620 回答
5

您是否尝试过将 os.path.getsize 替换为 os.tell,如下所示:

f2.write(line)
size = f2.tell()
于 2009-08-06T14:26:27.930 回答
4

自己跟踪尺寸将适合您的情况。另一种方法是在检查大小之前刷新文件缓冲区:

f2.write(line)
f2.flush()  # <-- buffers are written to disk
size = os.path.getsize('split.xml')

当然,经常这样做会降低文件 I/O 的速度。

于 2009-06-18T19:16:56.100 回答
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
于 2011-11-25T11:58:43.183 回答