【问题标题】:After writing to a file, why does os.path.getsize still return the previous size?写入文件后,为什么 os.path.getsize 仍然返回之前的大小?
【发布时间】:2009-06-18 16:38:24
【问题描述】:

我正在尝试将一个大的 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 是否在实际输出之前将输出存储在缓冲区中?

【问题讨论】:

    标签: python filesize


    【解决方案1】:

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

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

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

    但是

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

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

    【讨论】:

      【解决方案2】:

      是的,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 行分隔符,每行都会增加一个字节,但对于简单的分块来说应该足够了。)

      【讨论】:

      • 谢谢!那应该行得通。我不需要它是 100% 准确的。
      【解决方案3】:

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

      f2.write(line)
      size = f2.tell()
      

      【讨论】:

        【解决方案4】:

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

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

        当然,经常这样做会减慢文件 I/O。

        【讨论】:

          【解决方案5】:

          要查找到文件末尾的偏移量:

          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
          

          【讨论】:

            猜你喜欢
            • 2012-09-17
            • 1970-01-01
            • 1970-01-01
            • 2016-09-30
            • 1970-01-01
            • 1970-01-01
            • 2013-12-02
            • 2015-06-05
            • 1970-01-01
            相关资源
            最近更新 更多