有没有办法找到当前打开的文件对象的大小?
具体来说,我正在使用 tarfile 模块来创建 tarfile,但我不希望我的 tarfile 超过一定的大小。据我所知,tarfile 对象是类似文件的对象,所以我想一个通用的解决方案会起作用。
$ 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)
将文件对象的位置移动到文件的末尾。
好吧,如果文件对象支持tell方法,你可以这样做:
current_size = f.tell()
这将告诉您它当前是否正在写入。如果您以顺序方式写入,这将是文件的大小。
否则,您可以使用文件系统功能,即os.fstat
按照其他人的建议。
如果你有文件描述符,你可以用它fstat
来找出大小,如果有的话。一个更通用的解决方案是寻找文件的末尾,并在那里读取它的位置。
另一种解决方案是使用 StringIO “如果您正在执行内存操作”。
with open(file_path, 'rb') as x:
body = StringIO()
body.write(x.read())
body.seek(0, 0)
现在body
的行为类似于具有各种属性的文件对象,例如body.read()
.
body.len
给出文件大小。
没有人提到对我来说似乎最简单的方法,即len()
在阅读后使用该函数:
>>> with open("C:\\path\\to\\a\\file.txt", 'rb') as f:
... f_read = f.read()
... print(len(f_read))
...
36