ファイル オブジェクトを閉じる必要があると読みましたが、ファイル オブジェクトを閉じないことによってエラーが発生する非常に単純な例 (コード例) を実際に提供できる人はいますか?
7 に答える
これは、ファイルにデータを書き込んでいて、ファイルが適切に閉じられていない (およびそのバッファーがフラッシュされていない) ために、出力ファイルに書き込んだすべてのデータが最後に含まれていない場合に発生する可能性があります。
これは、この問題 Python not write full string to fileの SO に関するかなり最近の例です。
この問題は Python に固有のものではないことに注意してください。他の言語でもこれに遭遇する可能性があります (たとえば、C でこれに複数回遭遇しました)。
ファイルを閉じるのに失敗した場合、Python がエラーを発生させるかどうかを尋ねていますか? その場合、答えは「いいえ」です。
データを失う可能性があるかどうかを尋ねる場合、答えは「はい」です。
例えるなら、キーをイグニッションに置いたままにすると、警察はチケットを発行しますか? いいえ。この慣行は、あなたの車を「失う」確率を高めますか? はい。
編集:
わかりました、スマートアレックのコメントではなく、例を求めました。以下に例を示しますが、バッファー サイズのコーナー ケースを調査するよりもこれを実行する方が簡単であるため、少し不自然です。
良い:
fh = open("erase_me.txt", "w")
fh.write("Hello there!")
fh.close()
# Writes "Hello there!" to 'erase_me.txt'
# tcsh-13: cat erase_me.txt
# Hello there!tcsh-14:
悪い:
import os
fh = open("erase_me.txt", "w")
fh.write("Hello there!")
# Whoops! Something bad happened and my program bombed!
os._exit(1)
fh.close()
# tcsh-19: cat erase_me.txt
# tcsh-20: ll erase_me.txt
# -rw-r--r-- 1 me us 0 Jul 17 15:41 erase_me.txt
# (Notice file length = 0)
一部のオペレーティング システムでは、大量のデータをファイルに書き込んでファイルを閉じないと、libc がデータを破棄したときにデータがフラッシュされず、ファイルが切り捨てられます。
また、長時間実行されているプロセスで開いているファイルを閉じないと、プロセスごとに許可されているファイルを開くことができる最大数に達する可能性があることも付け加えておきます.Linuxシステムでは、コマンドを使用してデフォルトの制限を確認できますulimit -aH
.
注:私が話している制限は、物理ファイル、ソケットのほかに含まれるプロセスごとのファイル記述子の制限です...
ディレクトリ内の一連のファイルを処理しているとします。それらを閉じないと、大量のメモリが消費され、プログラムがファイル記述子やその他のリソースを使い果たす可能性さえあります。
ファイルへの参照が残っていない場合、CPython はファイルを閉じることを期待していますが、その動作は保証されておらず、参照カウントを使用しない Jython などの Python 実装でモジュールを使用しようとすると、奇妙なエラーが発生する可能性があります。バグまたは過度に長いガベージ コレクションのスパート
技術的にはエラーはありませんが、ガベージ コレクターがファイルを閉じるまでメモリに残り、他のプロセスに悪影響を及ぼす可能性があります。ファイル記述子は常に明示的に閉じる必要があります。
ファイル オブジェクトを扱うときは with キーワードを使用することをお勧めします。これには、途中で例外が発生した場合でも、スイートの終了後にファイルが適切に閉じられるという利点があります。また、同等の try-finally ブロックを記述するよりもはるかに短くなります。
で使用:
with open('test.txt', 'rb') as f:
buf = f.readlines()
些細な場合を除き、エラーが発生しない場合があり、ファイルにすべてのコンテンツが含まれている可能性がありますが、実際のプログラムでは壊滅的なエラーが発生する傾向があります。
Python の原則の 1 つは、「悪い動作は推奨されませんが、禁止されるべきではありません」であるため、「最終的に」ブロックでファイルを閉じることに常に焦点を当てることをお勧めします。