2012-06-21 18 views
13

と私はライン・バイ・ライン処理のためにライン・バイ・ラインファイル処理、forループ対

with open('data.txt') as inf: 
    for line in inf: 
     #etc 

をファイルを開くの 方法にこれらの間のトレードオフ/違いを理解しようとしています「と・ブロック」(スイート?) が終了する(または例外が打ち消された)とき
for line in open('data.txt'): 
    # etc 

私はwithを使用すると、閉じられたファイルを確実にすることを理解しています。だから私はwithを使いました。私はここでそれについて学びました。 for -loop再

:ネットの周りに検索するとSOから、for -loopが終了したとき、ファイル が閉じているかどうかは実装に依存しているようですか?そして の例外をこの構文がどのように処理するかについては何も見つかりませんでした。誰か知っていますか?私は上記のものについて誤解していた場合

、私が今までに withオーバーfor構文を使用するには、理由があるそうでない場合は、 を修正をいただければと思いますか?

答えて

21

この

for line in open('data.txt'): 
    # etc 

の問題点は、開いているファイルへの明示的な参照を保持していないということですので、どのようにそれを閉じていますか? 怠惰な方法は、ガベージコレクタがそれをクリーンアップするのを待っていますが、リソースが適時に解放されないことを意味する可能性があります。

だから、

inf = open('data.txt') 
for line in inf: 
    # etc 
inf.close() 

を言うことができる今、あなたがforループの内側にある中に例外がある場合はどうなりますか?ファイルは明示的に閉じられません。

try/finally

inf = open('data.txt') 
try: 
    for line in inf: 
     # etc 
finally: 
    inf.close() 

を追加しますこれは非常に単純な何かをするためのコードがたくさんあるので、Pythonは、より読みやすい形で書き込まれるように、このコードを有効にするためにwithを追加しました。これは私たちをここに連れて来る

with open('data.txt') as inf: 
    for line in inf: 
     #etc 

これはファイルを開くのに好ましい方法です。あなたのPythonがfor文のために古すぎる場合は、try/finallyバージョンをプロダクションコードに使用する必要があります

2

withステートメントは、Python 2.5でのみ導入されました。以前のバージョンとの下位互換性要件がある場合のみ、後者を使用する必要があります。理解することは素晴らしいではありませんが、大丈夫 - 声明で

もう少し明快

/最終的にシステムを除いて/試しを包含するように(あなたが認識しているとして)を導入しました。 Python(CのPython)では、それを実装することで開いているファイルを閉じます。言語そのものの仕様は、そうではありません。そうすれば、IPython、JPythonなどは、次のGCサイクルまでファイルを開いたままにし、メモリを開放し、何でも自由にすることができます。 CPython GCは.NETやJavaとは異なります...)。

私が聞いた唯一のことは、別のインデントレベルを追加することだと思います。

要約:動作しません。< 2.5、 'as'キーワードが導入され、インデントレベルが追加されました。

それ以外の場合は、通常どおり例外を処理することができ、何かがエスケープするとfinallyブロックがリソースを閉じます。

私のために働く!

+0

良い点..質問に選択肢があるとき、つまりバージョンによって制限されない私は質問を更新します。だから、あなたの投票は 'と'に行くだろう? – Levon

+0

インデントは、指定されたコンテキストの下にあるセクションを指定するので、利点です。 finallyブロック内のファイルを閉じる以外はtryブロック内でブロック全体を囲むようにインデントする必要があります。 – jdi

+0

@jdl良い点 - インデントの問題は私が提起したものではないことを知らせてください。リストとグループで数年前に気づいた。 –

関連する問題