file.flush()を使用しているコードを見ました。だから、私は周りを検索して、このSO投稿を見つけました。なぜフラッシュ方式があるのか理解できました。回答としてマークされた回答には、次のように書かれています。
通常、どちらの方法も気にする必要はありませんが、実際にディスクに何が表示されるかについての妄想が良いシナリオの場合は、指示に従って両方の呼び出しを行う必要があります。
だから、コンテキストマネージャーを使用してファイルを開いてテキストを書き込んだ後、コードがこのコンテキストマネージャーを終了すると、テキストがファイルに書き込まれていない可能性があるのではないかと思っていました。はいの場合、file.close()が呼び出されたときにPythonがこれを内部的に実行しないのはなぜですか?すでに行われていますか?
ファイルには、内のオブジェクトio
モジュール(あなたから得るものopen
)と、他のどこでも、いつでもSTDLIBに期待するflush
彼らときclose
、またはがそうすることが保証されているプラットフォームAPIに依存しています。
サードパーティのライブラリでさえclose
、オブジェクトをファイルオブジェクトにする場合は、メソッドで「ストリームを閉じてフラッシュする」必要があります。1
呼び出す主な理由flush
は、ファイルをまだ閉じていないが、他のプログラムが内容を確認したい場合です。
たとえば、多くの人が次のようなコードを記述します。
with open('dump.txt', 'w') as f:
while True:
buf = read_off_some_thingy()
f.write(buf.decode())
time.sleep(5)
…そして、なぜcat dump.txt
メモ帳などで開いたときに、空であるか、最後の3行が欠落しているか、行の途中で途切れているのか疑問に思います。それが問題のflush
解決です:
with open('dump.txt', 'w') as f:
while True:
buf = read_off_some_thingy()
f.write(buf.decode())
f.flush()
time.sleep(5)
または、代わりに、同じコードを実行していますが、問題は、誰かがコンピューターのプラグを抜く可能性があり(または、最近では、コンテナーを強制終了する可能性があります)、再起動後に破損したファイルが作成されて切断されることです。正中線でオフになり、出力をスキャンするperlスクリプトが実行されず、perlコードをデバッグする必要がなくなります。別の問題、同じ解決策。
ただし、ファイルがいずれかの時点で閉じられることを知っていて(たとえば、with
その前に終了するステートメントがあるため)、その時点より前にファイルを実行する必要がない場合は、必要ありません。を呼び出す必要がありますflush
。
あなたは言及しませんでしたがfsync
、これはまったく別の問題であり、ほとんどの人よりもはるかに複雑なので、私はそれには入りません。しかし、あなたがリンクした質問はすでに基本をカバーしています。
1.必要に応じてファイルオブジェクトに十分に近いダックタイプのファイルのようなオブジェクトでサードパーティのライブラリを使用している可能性は常にありますが、そうではありません。そして、そのようなタイプはそうclose
ではないかもしれませんflush
。しかし、正直なところ、flush
メソッドを持っていて、それをクローズで呼び出さなかったオブジェクトを見たことがないと思います。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加