2011-01-05 13 views
18

私はこの質問が技術的な問題ではなく "コーディングスタイル"の詳細だと思います。python closeファイル記述子の質問

buf = open('test.txt','r').readlines() 
... 

は、ファイルディスクリプタ自動的に閉じます、またはそれは、メモリ内に滞在する:

は、私は、コードの行を持って言いましたか? ファイルディスクリプタが閉じていない場合は、ファイルディスクリプタを閉じる方がいいですか?

答えて

35

あなたが変数にファイルオブジェクトを割り当てる場合は、明示的または(より一般的に望ましい).close()

f = open('test.txt','r') 
buf = f.readlines() 
f.close() 

を使用して、それを閉じることができますが、あなたはwithを使用することができますキーワードPython docsで述べたように(Pythonの2.5およびそれ以上):

withを使用することをお勧めしますファイル を扱う場合、キーワードはです。これは、 例外が発生したとしても、そのファイルが スイートの終了後に正しく閉じられているという利点があります()。また、書き込み同等 のtry-finallyブロックより はるかに短いです:

通常はCPythonに、ファイルがすぐにこの動作は将来のために保証するものではありませんが、参照カウントが(ゼロに低下したときに閉じている
>>> with open('test.txt','r') as f: 
...  buf = f.readlines() 
>>> f.closed 
True 
+1

"buf"はこの場合リストになります。 "close"メソッドはありません。 – jsbueno

+3

'with'は2.5で利用可能ですが、' from __future__ import with_statement'を使ってインポートする必要があります。これは2.6以降では必要ありません。 –

+0

@jsbueno私の間違いをキャッチしてくれてありがとう!私はあなたの観察を反映するために答えを更新しました! @Jay Conrod、情報ありがとう! (私は2.4から2.7に飛んだので、私はそれを経験したことはありません!) – sahhhm

5

ガベージコレクタがそれを閉じるまで、メモリに残ります。常にファイル記述子を明示的に閉じる必要があります。このような何かジャスト:

with open('test.txt', 'r') as f: 
    buf = f.readlines() 
+5

厳密に言えば、withを使用してファイルを "明示的に"閉じているわけではありません... –

+0

@Hugh Bothwell:Hmm。私はそれが明示的にあなたの定義に依存すると思う。私はそれを明示的に閉じて呼ぶだろう。 – Falmarri

+1

ファイルが閉じられるタイミングを正確に知っている限り、もっと明示的ですが、実際にはプログラミングの意味で明示的に呼び出すものではありません。 –

13

他の実装では、ファイルはgarbargeが収集されるまで閉じられません。これは後で長い時間がかかる可能性があります。

実装の動作によって異なる動作をするコードを持つスタイルが悪いです。

それは急ごしらえのスクリプトや通訳シェルにしようとしている何かのためだけなら、それは十分に良いですが、あなたは通常Falmarriの答え

+0

+1実用的な点です。 – martineau

+1

異なるPythonの実装でコーダーを起動した例は、Pythonで動作するときにMercurialがOSで許可されているオープンファイルの数を使い果たしてしまうことです。 Mercurialはこれを修正するために変更を受けています。 – TryPyPy

1

のようにコンテキストマネージャを使用する必要があり、生産作業の任意の並べ替えのためにそれは自動的になります閉鎖されていますが、実装に依存します。 with-blockを明示的に使用する方がいいですが、時折実行する小さなスクリプトを書くだけであれば、それは本当に重要ではありません。

+0

スクリプトのサイズと実行頻度はあまり関係ありません。スクリプトがそれらを開いている多くのファイルを反復処理する場合、それらが閉じていなければ本当に問題になります。遅かれ早かれ、ハンドルがなくなり、クラッシュします。 –

+1

あなたは正しいです、私は重要な部分を書いていませんでした:それは自分自身のためであり、ときどきでした。そのため、ファイルハンドルが足りなくなると、彼は気付くでしょう。 ;)しかし、彼は顧客のサイトにこれを置く場合。 : - / –

関連する問題