【问题标题】:Size of an open file object打开文件对象的大小
【发布时间】:2010-09-21 23:21:54
【问题描述】:

有没有办法找到当前打开的文件对象的大小?

具体来说,我正在使用 tarfile 模块来创建 tarfile,但我不希望我的 tarfile 超过一定的大小。据我所知,tarfile 对象是类似文件的对象,所以我想一个通用的解决方案会起作用。

【问题讨论】:

    标签: python file file-io filesize tarfile


    【解决方案1】:

    如果你有文件描述符,你可以使用fstat 找出大小,如果有的话。一个更通用的解决方案是寻找文件的末尾,并在那里读取它的位置。

    【讨论】:

      【解决方案2】:
      $ ls -la chardet-1.0.1.tgz
      -rwxr-xr-x 1 vinko vinko 179218 2008-10-20 17:49 chardet-1.0.1.tgz
      $ python
      Python 2.5.1 (r251:54863, Jul 31 2008, 22:53:39)
      [GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2
      Type "help", "copyright", "credits" or "license" for more information.
      >>> f = open('chardet-1.0.1.tgz','rb')
      >>> f.seek(0,2)
      >>> f.tell()
      179218L
      

      将 ChrisJY 的想法添加到示例中

      >>> import os
      >>> os.fstat(f.fileno()).st_size
      179218L
      >>>        
      

      注意:根据 cmets,f.seek(0, 2) 在调用 f.tell() 之前是必须的,否则它将返回大小 0。The reason is that f.seek(0, 2) moves the file object's position to the end of the file.

      【讨论】:

      • 有人能解释一下f.seek(0,2) 的魔力吗?为什么tell()没有它就返回0?
      • @m_poorUser f.seek(0, 2) 将文件对象的位置从文件末尾移动到 0 字节,因此文件对象的位置在文件末尾。然后,f.tell() 返回当前文件对象的位置,在这种情况下是文件的大小。见docs.python.org/2/tutorial/…
      • @IAbstract - 这是 Python3 中的新功能。在 Python2 中,f.seek 不返回任何内容,无论您传递给它的参数是什么。因此,f.tell() 应根据需要保留!
      • 在 Python 3.6 中,BufferedIORawIO 您可以使用 .tell() 来估计文件大小,根据定义,它将当前流位置作为不透明数字返回。而且该数字通常不代表 TextIO 底层二进制存储中的字节数。仅供参考。
      • 如果f.seek(0, 2)写成f.seek(0, os.SEEK_END),这个例子会更清楚。
      【解决方案3】:

      好吧,如果文件对象支持tell方法,你可以这样做:

      current_size = f.tell()
      

      这将告诉您它当前是否正在写入。如果您以顺序方式写入,这将是文件的大小。

      否则,您可以按照其他人的建议使用文件系统功能,即os.fstat

      【讨论】:

      • current_size 是一个错误的变量名,因为它表示文件的当前大小tell() 给出了文件流的当前位置——即下一次读/写发生的位置。
      • 根据 Python 3.6 文档,.tell() Return the current stream position as an opaque number. The number does not usually represent a number of bytes in the underlying binary storage.
      【解决方案4】:

      另一个解决方案是使用 StringIO “如果您正在执行内存操作”。

      with open(file_path, 'rb') as x:
          body = StringIO()
          body.write(x.read())
          body.seek(0, 0)
      

      现在body 的行为类似于具有各种属性的文件对象,例如body.read()

      body.len 给出文件大小。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-31
        • 2022-11-29
        • 1970-01-01
        • 1970-01-01
        • 2017-02-02
        • 2015-08-15
        • 2017-09-02
        • 2012-02-17
        相关资源
        最近更新 更多