以前の質問について、open()
関数を使用した両方の回答で、ファイルを閉じることについての言及がないことに気付きました。
そうすることは良い習慣だと私は読みましたが、実際にはそれが必要ですか?それは単に不要なコードですか?
ファイルは自動的に閉じられますか?
python3
、参照がなくなると、ファイルは自動的にゴミになります。
以前の質問について、open()
関数を使用した両方の回答で、ファイルを閉じることについての言及がないことに気付きました。
そうすることは良い習慣だと私は読みましたが、実際にはそれが必要ですか?それは単に不要なコードですか?
ファイルは自動的に閉じられますか?
python3
、参照がなくなると、ファイルは自動的にゴミになります。
回答:
ファイルはいつ閉じられますか?
からわかるように、ファイルを明示的に閉じることは重要ですか?(StackOverflow)、Pythonインタープリターは次の場合にファイルを閉じます。
close()
、file
オブジェクトのメソッドを明示的または暗黙的に手動で呼び出しwith open(...):
ます。もちろん、これはいつでも、どのPython実装でも機能します。file
オブジェクトの最後の参照が削除されましたので、オブジェクトがガベージコレクタによって処理されます。これは言語機能ではありませんが、CPython実装の特別な機能であるため、移植性のためにこれに依存しないでください。したがって、信頼できるのは最初の(手動)方法だけです。
ファイルが開いたままの場合はどうなりますか?
まず、Pythonインタープリターの実装によっては、書き込みアクセスでファイルを開いた場合、手動でファイルを生成するか、ファイルハンドラーを閉じるまで、変更がディスクにフラッシュされたかどうかを確認できません。
次に、システム上でユーザーごとに限られた数のファイルのみを開くことができます。たとえば、Pythonプログラムのループで多くのファイルをできるだけ早く閉じずに開くことによってこの制限を超えると、システムはそれ以上ファイルハンドルを開くことを拒否し、例外を受け取ります。また、プログラムが最後に許可されたオープンファイルを取得し、拒否されるために別のプログラムが失敗する場合もあります。
第3に、リムーバブルデバイスでファイルを開くと、アンマウントまたはイジェクトできなくなります。のような一部のファイルシステムではファイルを削除できますext4
が、ファイルのiノードへのファイル記述子/ハードリンクが削除/リンク解除されますが、ファイルを開いたプログラムは、独自の一時ファイルハンドラーを介してiノードにアクセスできます。これは、たとえば、それぞれのソフトウェアの実行中にパッケージを更新できるメカニズムでもあります。ただし、たとえばNTFSにはそのような機能はありません。ただし、2つの同時プロセスによって変更されることはないため、他のユーザーに対しては何らかの形でブロックされます。
python3
もう存在せず、回答は古くなっています。自動ガベージコレクションは何らかの理由で存在し、完全に機能します。私が特別に使用してから数年が経ちましたclose()
。決して今までそれを使用しないことによって生じた単一のエラーに遭遇しました。
with open (file_name, ...) as variable:
close()
このコードブロックを終了するとすぐに、メソッドが自動的に呼び出されます。