打开文件对象的大小

发布于 2024-07-09 06:36:01 字数 135 浏览 12 评论 0原文

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

具体来说,我正在使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

樱桃奶球 2024-07-16 06:36:01
$ 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) /code>,如果没有它,它将返回 0 的大小。 原因是f.seek(0, os.SEEK_END) 将文件对象的位置移动到文件末尾。

$ 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

Adding ChrisJY's idea to the example

>>> import os
>>> os.fstat(f.fileno()).st_size
179218L
>>>        

Note: Based on the comments, f.seek(0, os.SEEK_END) is must before calling f.tell(), without which it would return a size of 0. The reason is that f.seek(0, os.SEEK_END) moves the file object's position to the end of the file.

绅刃 2024-07-16 06:36:01

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

current_size = f.tell()

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

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

Well, if the file object support the tell method, you can do:

current_size = f.tell()

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.

橘味果▽酱 2024-07-16 06:36:01

如果您有文件描述符,则可以使用 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.

○闲身 2024-07-16 06:36:01

我很好奇两者的性能影响,因为一旦打开文件,句柄的 name 属性就会为您提供文件名(因此您可以调用 os.stat它)。

下面是eek/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

对于 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 call os.stat on it).

Here's a function for the seek/tell method:

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

With a 65 MiB file on an SSD, Windows 10, this is some 6.5x faster than calling os.stat(f.name)

我不吻晚风 2024-07-16 06:36:01

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

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

现在 body 的行为就像一个具有各种属性的文件对象,例如 body.read()

body.len 给出文件大小。

Another solution is using StringIO "if you are doing in-memory operations".

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

Now body behaves like a file object with various attributes like body.read().

body.len gives the file size.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文