2016-07-29 9 views
4

this questionのpython one-linerについてのコメントでは、私には匿名ファイルオブジェクトをどうpythonが処理するのか分かりませんでした。質問から:匿名ファイルオブジェクトはいつ/どのように閉じますか?

open(to_file, 'w').write(open(from_file).read()) 

(私はファイルを処理する方法通常である)withキーワードを使用せずにopenへの2つの呼び出しがあります。私はこれまで、この種の名前のないファイルを使用してきました。 IIRCでは、1〜2分後に失効するOSレベルのロックが残っていたようです。

これらのファイルハンドルはどうなりますか?彼らはガベージコレクションによってきれいにされていますか? OSで? close()が呼び出されると、Pythonのマシンとファイルはどうなりますか?スクリプトが終了して時間が経過すると、どうにかなりますか?

答えて

4

Linuxのファイルディスクリプタ(/ proc/$$/fdsをチェック)とWindowsのファイルハンドル(SysInternalsツールを使用)を監視すると、ファイルがステートメントの直後に閉じられているように見えます。

ガベージコレクタが実行されなければならないので、しかし、これはおかしくありません。私が行ったテストでは、毎回一度閉じてしまいます。

ステートメントはopenと一緒に使用することをお勧めしますが、実際に必要な場合はまれです。 withを使用しなければならないシナリオを示すことは困難ですが、安全であることはおそらく良い考えです。

だからあなたのワンライナーは次のようになります。

with open(to_file, 'w') as tof, open(from_file) as fof: 
    tof.write(fof.read()) 

withの利点は、(IOクラスの)特別なメソッドが呼び出される* __exit__()が保証されて呼ばれていることです。

os._exit()のようなことをしない限り、

1

ガベージコレクタがファイルを収集した後にファイルがクローズされるため、CPythonは参照カウントを使用するためすぐにファイルを収集しますが、これは保証された動作ではありません。

ループでファイルを閉じずにファイルを使用すると、ファイル記述子が不足する可能性があります。そのため、withステートメントを使用することをお勧めします(2.5を使用している場合はfrom __future__ import with_statementを使用できます)。

関連する問題