71

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

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

4

5 回答 5

108
$ 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
>>>        

注意:根据注释,f.seek(0, 2)在调用之前是必须的f.tell(),否则它将返回 0 的大小。原因是f.seek(0, 2)将文件对象的位置移动到文件的末尾。

于 2008-11-12T11:55:30.307 回答
11

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

current_size = f.tell()

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

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

于 2008-11-12T11:59:36.087 回答
7

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

于 2008-11-12T11:55:27.407 回答
1

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

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

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

body.len给出文件大小。

于 2016-08-17T09:07:29.983 回答
-1

没有人提到对我来说似乎最简单的方法,即len()在阅读后使用该函数:

>>> with open("C:\\path\\to\\a\\file.txt", 'rb') as f:
...     f_read = f.read()  
...     print(len(f_read))
... 
36
于 2022-02-11T10:28:35.910 回答