71

現在開いているファイル オブジェクトのサイズを確認する方法はありますか?

具体的には、tarfile モジュールを使用して tarfile を作成していますが、tarfile が特定のサイズを超えないようにしたいと考えています。私の知る限り、tarfile オブジェクトはファイルのようなオブジェクトなので、一般的な解決策が機能すると思います。

4

5 に答える 5

108
$ 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)を呼び出す前に is must を実行する必要があります。これがないf.tell()と、サイズ 0 が返されます。その理由はf.seek(0, 2)、ファイル オブジェクトの位置がファイルの末尾に移動するためです。

于 2008-11-12T11:55:30.307 に答える
11

ファイル オブジェクトが tell メソッドをサポートしている場合は、次のことができます。

current_size = f.tell()

それは、それが現在書いているかどうかを教えてくれます。シーケンシャルに書き込む場合、これがファイルのサイズになります。

os.fstatそれ以外の場合は、他の人が提案したように、ファイル システム機能を使用できます。

于 2008-11-12T11:59:36.087 に答える
7

ファイル記述子がある場合は、使用fstatしてサイズを確認できます。より一般的な解決策は、ファイルの最後までシークし、その場所を読み取ることです。

于 2008-11-12T11:55:27.407 に答える
1

別の解決策は、「メモリ内操作を行っている場合」に StringIO を使用することです。

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

bodyのようなさまざまな属性を持つファイル オブジェクトのように動作するようになりましたbody.read()

body.lenファイルサイズを与えます。

于 2016-08-17T09:07:29.983 に答える