0

私がする時

open('output1.txt', 'w').write("Hello guys")

output1.txtというファイルがすぐに作成され、「Helloguys」という文字列が含まれています。しかし、私がするとき

openvar = open('output2.txt', 'w')
openvar.write("Hello guys")

次に、ファイルoutput2.txtのみが作成されます。「Helloguys」というテキストは、私が実行したときにoutput2.txtにのみ表示されますopenvar.close()。余分な変数の割り当てだけが原因でこの動作が異なるのはなぜですか?

4

2 に答える 2

10

Pythonは、最初のケースでファイルオブジェクトが参照されなくなったことを検出するため、ガベージコレクターがそれを収集し、ファイルを閉じるデストラクタを呼び出します。

2番目のケースでは、ファイルオブジェクトはまだ存在しているため、自動的に閉じられません。


エリアが完了したら、常にファイルを閉じる必要があります。ステートメントはこれwithを非常に簡単にします:

with open('output.txt', 'w') as f:
    f.write('Hello')

ブロックが離れるとすぐに、ブロック内のコードで例外が発生した場合でも、ファイルは再び閉じられます。


何らかの理由でファイルを開いたままにする必要がある場合(たとえば、より多くのデータを書き込むため)、.flush()システムに書き込みバッファーを空にして、実際にファイルに書き込むことができます。

于 2012-04-05T08:26:24.090 に答える
2

最初のケースでは、ガベージコレクターがファイルを閉じます。そのファイルへの参照はありません。2番目のケースでは、ファイルへの参照を作成しました。手動で閉じる必要があります。そうしないと、参照が破棄されたときにガベージコレクタによって閉じられます。

于 2012-04-05T08:27:32.073 に答える