3

ファイル内の行を次のように反復するコードに出くわしました。

for line in open(filename, 'r'):
    do_all_the_things()

それは次のようなもののよりPythonicなバージョンですか:

with open(filename, 'r') as f:
    for line in f:
        do_all_the_things()

インデントが少ないので見栄えが良くなりますが、同じですか?私が知っていることから、with基本的finally: f.close()にその効果にまたは何かを追加して、ブロックを離れた後にオブジェクトがクリーンアップされるようにします。最初のforループが終了して (またはおそらく a で短くされてbreak)、変数が範囲外になると、同じことが起こりますか? コードの最初のビットからヒントを得て、キーストロークを節約できますか、それとも修正する必要がありますか?

4

2 に答える 2

1

必ずコンテキストマネージャーを使用してください。これは、ファイル オブジェクトが適切に処理されることを保証する唯一の方法です。

最初のバージョンでは (現在) Cpython で問題が発生することはほとんどありませんが、仕様では、いつ (またはが呼び出されたとして)__del__は指定されていません。このため、最初のバージョンを使用してファイル オブジェクトが適切にファイナライズされるかどうかを確実に知ることはできません。

于 2013-04-19T17:22:42.933 に答える