0

ファイルがtest.txtあり、その内容を印刷したいとします。私はPythonでこのようにそれを行うことができます(これは私の質問を説明するための単なる例であり、良いコードの例ではありません):

for i in (line for line in open('test.txt')):
    print ">", i,

以前straceは、コードの実行後にファイルが開いたり閉じたりすることを確認していました。

質問:ファイルが閉じられるのはなぜですか?コンテキストマネージャーと関係があると思いますが、この種の構成への参照と、ファイルが自動的に閉じられる理由が見つかりません。舞台裏で何が起こっているのかを誰が知っていて、それを説明できるでしょうか?

4

2 に答える 2

4

ファイルへの参照がスコープ外になると、そのファイルはガベージコレクションされ、削除の一部として閉じられます。ファイルを名前に割り当てないため、ループが終了するとすぐにスコープ外になります。ただし、これは信頼できるものではありません。代わりに、実際のコンテキストマネージャーを使用してください。例:

with open('test.txt') as f:
    for i in f:
        print(">", i, end="")

ジェネレータ式はここでは何もしないので、削除したことにも注意してください。

于 2012-08-22T17:31:11.347 に答える
1

この回答を参照してください。ファイルオブジェクトへの参照を保持しないため、ループの実行後、ファイルオブジェクトへの参照はありません。その後、ガベージコレクションが行われ、これが発生すると、ファイルが閉じられます。ただし、ループの直後にガベージコレクションが行われるという保証はありません。Pythonが使用されていないことに気付く前に、しばらく座っている可能性があります。このため、ファイルを明示的に閉じるか、withブロックを使用して閉じられるようにすることをお勧めします。

于 2012-08-22T17:33:24.900 に答える