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


9

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

そうすることは良い習慣だと私は読みましたが、実際にはそれが必要ですか?それは単に不要なコードですか?

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


1
with open (file_name, ...) as variable:close()このコードブロックを終了するとすぐに、メソッドが自動的に呼び出されます。
バイトコマンダー


@ByteCommanderこの質問を「解決」するために、コメントを回答として与えますか?
TellMeWhy 2015年

1
ではpython3、参照がなくなると、ファイルは自動的にゴミになります。
Jacob Vlijm 2015年

4
Ubuntuでのスクリプト作成に関係のないPythonに関する一般的な質問であるため、この質問をトピック外として閉じることに投票します。プログラミング言語のベストプラクティスについて尋ねています。
terdon 2015年

回答:


9

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

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

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

したがって、信頼できるのは最初の(手動)方法だけです。

ファイルが開いたままの場合はどうなりますか?

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

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

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


python3には完全には当てはまりません!!
Jacob Vlijm 2015年

@JacobVlijm説明していただけませんか?
バイトコマンダー

質問の下のコメントを参照してください。回答のリンクにある「不適切な実践」についての回答は2011年からです。それが存在した場合、警告はpython3もう存在せず、回答は古くなっています。自動ガベージコレクションは何らかの理由で存在し、完全に機能します。私が特別に使用してから数年が経ちましたclose()。決して今までそれを使用しないことによって生じた単一のエラーに遭遇しました。
Jacob Vlijm 2015年

Soo ... PyPy、Jython、IronPythonなどの他の実装がCPythonと同じ方法でファイルを閉じるかどうかを知っていますか?そして、もし私がインタープリターを殺したなら、ファイルを閉じる機会がなかったでしょう?また、オープンファイルの制限がまだ適用されていると思います。書き込まれたデータをフラッシュするのはどうですか?そこで最新のものを知っていますか?
バイトコマンダー

1
@JacobVlijm先端をありがとう。:Pそのファイルの作成中にマシンがすでにクラッシュしました...そのためにPythonも必要としませんでした。
バイトコマンダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.