当前位置:  开发笔记 > 编程语言 > 正文

打开文件对象的大小

如何解决《打开文件对象的大小》经验,为你挑选了3个好方法。

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

具体来说,我正在使用tarfile模块来创建tarfiles,但我不希望我的tarfile超过一定的大小.据我所知,tarfile对象是类文件对象,所以我想通用解决方案是可行的.



1> Vinko Vrsalo..:
$ 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.seek(0,os.SEEK_END)`,那么这个例子会更清楚.
@m_poorUser`f.seek(0,2)`将文件对象的位置从文件末尾移动到0字节,因此文件对象的位置位于文件的末尾.然后,`f.tell()`返回当前文件对象的位置,在这种情况下,该位置是文件的大小.请参阅https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects
有人能否对`f.seek(0,2)`的魔力有所了解?为什么`tell()`在没有它的情况下返回0?
在Python 3.6中,虽然`BufferedIO`和`RawIO`可以使用.tell()来估计文件大小,但根据定义,它会以不透明数字的形式返回当前流的位置。而且该数字通常不表示TextIO的基础二进制存储中的字节数。仅供参考。

2> PierreBdR..:

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

current_size = f.tell()

那将告诉你它是否正在写作.如果以顺序方式写入,则这将是文件的大小.

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


“ current_size”是错误的变量名,因为它意味着文件的“当前大小”。tell()提供文件流的当前位置,即下一次读/写的位置。
根据Python 3.6 doc,`.tell()将当前流位置作为不透明数返回.该数字通常不代表底层二进制存储中的字节数

3> Chris Jester..:

如果有文件描述符,则可以使用它fstat来找到大小(如果有)。一个更通用的解决方案是寻找文件的结尾,然后在该文件中读取其位置。

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有