打开文件对象的大小

str*_*551 54 python

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

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

Vin*_*vic 85

$ 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
Run Code Online (Sandbox Code Playgroud)

将ChrisJY的想法添加到示例中

>>> import os
>>> os.fstat(f.fileno()).st_size
179218L
>>>        
Run Code Online (Sandbox Code Playgroud)

  • 如果`f.seek(0,2)`被写为`f.seek(0,os.SEEK_END)`,那么这个例子会更清楚. (5认同)
  • @m_poorUser`f.seek(0,2)`将文件对象的位置从文件末尾移动到0字节,因此文件对象的位置位于文件的末尾.然后,`f.tell()`返回当前文件对象的位置,在这种情况下,该位置是文件的大小.请参阅https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects (4认同)
  • 有人能否对`f.seek(0,2)`的魔力有所了解?为什么`tell()`在没有它的情况下返回0? (2认同)
  • @IAbstract - 这是 Python3 中的新功能。在 Python2 中,`f.seek` 不返回任何内容,无论你传递给它什么参数。因此,`f.tell()` 应该根据需要保留! (2认同)
  • 在Python 3.6中,虽然`BufferedIO`和`RawIO`可以使用.tell()来估计文件大小,但根据定义,它会以不透明数字的形式返回当前流的位置。而且该数字通常不表示TextIO的基础二进制存储中的字节数。仅供参考。 (2认同)
  • 您不需要“tell()”,因为“seek()”已经返回它所设置的位置。 (2认同)

Pie*_*BdR 9

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

current_size = f.tell()
Run Code Online (Sandbox Code Playgroud)

那将告诉你它是否正在写作.如果以顺序方式写入,则这将是文件的大小.

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

  • “ current_size”是错误的变量名,因为它意味着文件的“当前大小”。tell()提供文件流的当前位置,即下一次读/写的位置。 (2认同)
  • 根据Python 3.6 doc,`.tell()将当前流位置作为不透明数返回.该数字通常不代表底层二进制存储中的字节数 (2认同)
  • @Devy [仅当文件以文本模式打开时](https://docs.python.org/3.6/tutorial/inputoutput.html?highlight=tell#methods-of-file-objects)。 (2认同)

Chr*_*ung 5

如果有文件描述符,则可以使用它fstat来找到大小(如果有)。一个更通用的解决方案是寻找文件的结尾,然后在该文件中读取其位置。