【发布时间】:2010-09-21 23:21:54
【问题描述】:
有没有办法找到当前打开的文件对象的大小?
具体来说,我正在使用 tarfile 模块来创建 tarfile,但我不希望我的 tarfile 超过一定的大小。据我所知,tarfile 对象是类似文件的对象,所以我想一个通用的解决方案会起作用。
【问题讨论】:
标签: python file file-io filesize tarfile
有没有办法找到当前打开的文件对象的大小?
具体来说,我正在使用 tarfile 模块来创建 tarfile,但我不希望我的 tarfile 超过一定的大小。据我所知,tarfile 对象是类似文件的对象,所以我想一个通用的解决方案会起作用。
【问题讨论】:
标签: python file file-io filesize tarfile
如果你有文件描述符,你可以使用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,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?
f.seek(0, 2) 将文件对象的位置从文件末尾移动到 0 字节,因此文件对象的位置在文件末尾。然后,f.tell() 返回当前文件对象的位置,在这种情况下是文件的大小。见docs.python.org/2/tutorial/…
f.seek 不返回任何内容,无论您传递给它的参数是什么。因此,f.tell() 应根据需要保留!
BufferedIO 和 RawIO 您可以使用 .tell() 来估计文件大小,根据定义,它将当前流位置作为不透明数字返回。而且该数字通常不代表 TextIO 底层二进制存储中的字节数。仅供参考。
f.seek(0, 2)写成f.seek(0, os.SEEK_END),这个例子会更清楚。
好吧,如果文件对象支持tell方法,你可以这样做:
current_size = f.tell()
这将告诉您它当前是否正在写入。如果您以顺序方式写入,这将是文件的大小。
否则,您可以按照其他人的建议使用文件系统功能,即os.fstat。
【讨论】:
current_size 是一个错误的变量名,因为它表示文件的当前大小。 tell() 给出了文件流的当前位置——即下一次读/写发生的位置。
.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.
另一个解决方案是使用 StringIO “如果您正在执行内存操作”。
with open(file_path, 'rb') as x:
body = StringIO()
body.write(x.read())
body.seek(0, 0)
现在body 的行为类似于具有各种属性的文件对象,例如body.read()。
body.len 给出文件大小。
【讨论】: