是否有办法查找当前打开的文件对象的大小?
具体来说,我使用 tarfile 模块来创建 tarfiles,但是我不希望我的 tarfile 超过一定的大小。据我所知,tarfile 对象是类似于文件的对象,所以我想一个通用的解决方案是可行的。
如果有文件描述符,可以使用 fstat查找大小(如果有的话)。一个更通用的解决方案是寻找到文件的末尾,并在那里读取它的位置。
fstat
$ 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, os.SEEK_END) >>> f.tell() 179218L
将 ChrisJY 的想法添加到示例中
>>> import os >>> os.fstat(f.fileno()).st_size 179218L >>>
注意 : 根据注释,在调用 f.tell()之前,f.seek(0, os.SEEK_END)必须返回0。原因是 f.seek(0, os.SEEK_END)将文件对象的位置移动到文件的末尾。
f.tell()
f.seek(0, os.SEEK_END)
如果 file 对象支持 tell 方法,那么可以这样做:
current_size = f.tell()
它会告诉你它是否正在写作。如果按顺序编写,这将是文件的大小。
否则,您可以使用文件系统功能,即其他人建议的 os.fstat。
os.fstat
另一个解决方案是使用 StringIO“如果您正在进行内存中操作”。
with open(file_path, 'rb') as x: body = StringIO() body.write(x.read()) body.seek(0, 0)
现在,body的行为类似于具有各种属性(如 body.read())的文件对象。
body
body.read()
body.len给出文件大小。
body.len
我对两者的性能影响都很好奇,因为一旦打开一个文件,句柄的 name属性就会给出文件名(因此可以对其调用 os.stat)。
name
os.stat
下面是 find/tell 方法的一个函数:
import io def seek_size(f): pos = f.tell() f.seek(0, io.SEEK_END) size = f.tell() f.seek(pos) # back to where we were return size
使用 SSD 上的65MiB 文件,Windows 10,这比调用 os.stat(f.name)快6.5倍
os.stat(f.name)