web-dev-qa-db-ja.com

Pythonで `open()`で開いた後にファイルを閉じる必要がありますか?

以前の question に関して、open()関数を使用した両方の回答で、ファイルを閉じることについて言及されていないことに気付きました。

そうするのは良い習慣だと読んだことがありますが、実際にはそれが必要ですか?それは単に不必要なコードですか?

ファイルは自動的に閉じられますか?

8
TellMeWhy

ファイルはいつ閉じられますか?

明示的にファイルを閉じることは重要ですか?(StackOverflow) からわかるように、Pythonインタープリターは次の場合にファイルを閉じます。

  • close()ブロックを残すことにより、fileオブジェクトのwith open(...):メソッドを明示的または暗黙的に手動で呼び出します。もちろん、これは常に、およびPython実装で機能します。
  • fileオブジェクトの最後の参照が削除されたため、オブジェクトはガベージコレクターによって処理されます。これは言語機能ではなく、CPython実装の特別な機能のみであるため、移植性のためにこれに依存しないでください!
  • Pythonインタープリターは終了します。この場合、should開いたすべてのファイルハンドルを閉じます。 Python3の一部の古いバージョンでは、自分で手動で閉じる必要があるという警告も出力されます。ただし、クラッシュを想像するか、Pythonインタープリターを強制終了すると、これも信頼できないことがわかります。

したがって、最初の(手動の)方法のみが信頼できます!

ファイルを開いたままにするとどうなりますか?

まず、Pythonインタープリターの実装によっては、書き込みアクセスでファイルを開いた場合、手動で誘導するかファイルハンドラーが取得するまで、変更がディスクにフラッシュされたことを確認できません。閉まっている。

第二に、システムごとにユーザーごとに限られた数のファイルのみを開くことができます。この制限を超えた場合Pythonプログラムのループで多くのファイルをできるだけ早く閉じずに開くと、システムはそれ以上のファイルハンドルを開くことを拒否する場合があり、例外が表示されます。また、プログラムが最後に許可されたオープンファイルを取得し、別のプログラムが拒否されるために失敗することもあります。

第三に、リムーバブルデバイスでファイルを開くと、アンマウントまたはイジェクトされなくなります。 ext4のような一部のファイルシステムでは、ファイルを削除できます。ファイル記述子/ファイルのiノードへのハードリンクは単に削除/リンク解除されますが、ファイルを開いたプログラムは独自の一時ファイルを介してiノードにアクセスできますハンドラ。これは例えばまた、それぞれのソフトウェアの実行中にパッケージを更新できるメカニズム。しかし、例えばNTFSにはそのような機能はありません。ただし、2つの並行プロセスによって変更されることはないため、他のプロセスに対しては何らかの形でブロックされます。

7
Byte Commander