2 GBを超えないようにしたいファイルがあります(ext 2を使用するシステムで実行する必要があるため)。チェックの合間にこのファイルに書き込むことを念頭に置いて、ファイルのサイズをチェックする良い方法は何ですか?特に、まだディスクに書き込まれていない、バッファリングされ、フラッシュされていない変更について心配する必要がありますか?
7 に答える
おそらくあなたが望むものではないかもしれませんが、とにかくそれを提案します。
import os
a = os.path.getsize("C:/TestFolder/Input/1.avi")
または、開いているファイルの場合は、開いているファイルで使用できるfstat関数を使用できます。ファイルオブジェクトではなく整数のファイルハンドルを使用するため、ファイルオブジェクトでfilenoメソッドを使用する必要があります。
a = open("C:/TestFolder/Input/1.avi")
b = os.fstat(a.fileno()).st_size
os.fstat(file_obj.fileno()).st_size
トリックを行う必要があります。書き込まれたバイトが返されると思います。バッファリングが心配な場合は、いつでも事前にフラッシュを実行できます。
これは古い質問ですが、Isakが最も簡単な解決策だと思います。Pythonでそれを行う方法は次のとおりです。
# Assuming f is an open file
>>> pos = f.tell() # Save the current position
>>> f.seek(0, 2) # Seek to the end of the file
>>> length = f.tell() # The current position is the length
>>> f.seek(pos) # Return to the saved position
>>> print length
1024
私はPythonに精通していませんが、ストリームオブジェクト(またはファイルを開いたときに取得するもの)には、ストリームの現在の位置を含むプロパティがありませんか?
ftell() C関数、または.NETのStream.Positionで得られるものと同様です。
明らかに、これは、ストリームの最後に位置している場合にのみ機能します。これは、現在ストリームに書き込んでいる場合です。
このアプローチの利点は、ファイルを閉じたり、フラッシュされていないデータについて心配したりする必要がないことです。
次のようなものから始めることができます。
class TrackedFile(file):
def __init__(self, filename, mode):
self.size = 0
super(TrackedFile, self).__init__(filename, mode)
def write(self, s):
self.size += len(s)
super(TrackedFile, self).write(s)
次に、次のように使用できます。
>>> f = TrackedFile('palindrome.txt', 'w')
>>> f.size
0
>>> f.write('A man a plan a canal ')
>>> f.size
21
>>> f.write('Panama')
27
明らかに、ファイルを最初から作成していない場合、この実装は機能しませんが、__init__
初期データを処理するようにメソッドを適応させることはできます。たとえば、他のいくつかのメソッドをオーバーライドする必要がある場合もありwritelines
ます。
文字列は単なるバイトシーケンスであるため、これはエンコーディングに関係なく機能します。
>>> f2 = TrackedFile('palindrome-latin1.txt', 'w')
>>> f2.write(u'A man a plan a canál '.encode('latin1')
>>> f3 = TrackedFile('palindrome-utf8.txt', 'w')
>>> f3.write(u'A man a plan a canál '.encode('utf-8'))
>>> f2.size
21
>>> f3.size
22
または、ファイルがすでに開いている場合:
>>> fsock = open('/etc/hosts', 'rb').read()
>>> len(fsock)
444
これがファイルのバイト数です。
最も信頼できるのは、ファイルを開いたときにファイルのサイズをチェックし、書き込みおよびシーク操作を追跡し、それらの操作に基づいて現在のサイズをカウントし、サイズ制限を超えないようにするラッピングクラスを作成することです。