2008-11-12 64 views
40

有沒有辦法找到當前打開的文件對象的大小?打開的文件對象的大小

具體來說,我正在與tarfile模塊創建tarfiles,但我不希望我的tarfile超過一定的大小。據我所知,tarfile對象是類文件對象,所以我想一個通用的解決方案將工作。

回答

66
$ 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 
>>>   
+0

http://docs.python.org/library/stat.html#stat.ST_SIZE`os.fstat`返回`stat`結構,請使用`st_size` – shevski 2011-10-11 10:00:55

+1

有人可以闡明`f .seek(0,2)`?爲什麼`tell()`沒有它返回0? – 2015-08-31 11:45:04

4

如果您有文件描述符,可以使用fstat找出大小(如果有的話)。更通用的解決方案是尋找文件的結尾,並在那裏讀取它的位置。

7

那麼,如果該文件對象支持tell方法,你可以這樣做:

current_size = f.tell() 

,將告訴你它是目前寫作。如果以順序方式寫入,這將是文件的大小。

否則,您可以使用其他人建議的文件系統功能,即os.fstat

1

另一種解決方案是使用StringIO「如果您正在執行內存中操作」。

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

現在body表現如同像body.read()各種屬性的文件對象。

body.len給出文件大小。