打开文件对象的大小
有没有办法找到当前打开的文件对象的大小?
具体来说,我正在使用 tarfile 模块来创建 tarfile,但我不希望 tarfile 超过特定大小。 据我所知,tarfile 对象是类似文件的对象,所以我想通用的解决方案会起作用。
Is there a way to find the size of a file object that is currently open?
Specifically, I am working with the tarfile module to create tarfiles, but I don't want my tarfile to exceed a certain size. As far as I know, tarfile objects are file-like objects, so I imagine a generic solution would work.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
将ChrisJY的想法添加到示例中
注意:根据注释,在调用
f.tell()<之前必须先调用
f.seek(0, os.SEEK_END)
/code>,如果没有它,它将返回 0 的大小。 原因是f.seek(0, os.SEEK_END)
将文件对象的位置移动到文件末尾。Adding ChrisJY's idea to the example
Note: Based on the comments,
f.seek(0, os.SEEK_END)
is must before callingf.tell()
, without which it would return a size of 0. The reason is thatf.seek(0, os.SEEK_END)
moves the file object's position to the end of the file.好吧,如果文件对象支持tell方法,你可以这样做:
这会告诉你它当前正在写入。 如果您以顺序方式写入,这将是文件的大小。
否则,您可以使用文件系统功能,即其他人建议的 os.fstat 。
Well, if the file object support the tell method, you can do:
That will tell you were it is currently writing. If you write in a sequential way this will be the size of the file.
Otherwise, you can use the file system capabilities, i.e.
os.fstat
as suggested by others.如果您有文件描述符,则可以使用 fstat 来找出大小(如果有)。 更通用的解决方案是查找文件末尾,并读取其位置。
If you have the file descriptor, you can use
fstat
to find out the size, if any. A more generic solution is to seek to the end of the file, and read its location there.我很好奇两者的性能影响,因为一旦打开文件,句柄的
name
属性就会为您提供文件名(因此您可以调用os.stat
它)。下面是eek/tell 方法的函数:
对于 Windows 10 SSD 上的 65 MiB 文件,这比调用 os.stat(f.name) 快 6.5 倍
I was curious about the performance implications of both, since once you open a file, the
name
attribute of the handle gives you the filename (so you can callos.stat
on it).Here's a function for the seek/tell method:
With a 65 MiB file on an SSD, Windows 10, this is some 6.5x faster than calling
os.stat(f.name)
另一个解决方案是使用 StringIO“如果您正在进行内存操作”。
现在
body
的行为就像一个具有各种属性的文件对象,例如body.read()
。body.len
给出文件大小。Another solution is using StringIO "if you are doing in-memory operations".
Now
body
behaves like a file object with various attributes likebody.read()
.body.len
gives the file size.