4

私が次のことをした場合:

import codecs
lines = codecs.open(somefile, 'r','utf8').readlines()

初期化していないファイルを閉じる方法はありますか? もしそうなら、どのように?通常、私はできたはずです:

import codecs
reader = codecs.open(somefile, 'r','utf8') 
lines = reader.readlines()
reader.close()
4

1 に答える 1

6

CPython では、参照カウントが返された直後の 0 になると、ファイル オブジェクトは自動的に閉じ.readlines()ます。他の Python 実装では、使用されるガベージ コレクション アルゴリズムによっては、もう少し時間がかかる場合があります。ファイルは、プログラムの終了までに確実に閉じられます。

実際には、ファイル オブジェクトをコンテキスト マネージャーとして使用し、withステートメント呼び出しを閉じる必要があります。

with codecs.open(somefile, 'r','utf8') as reader:
    lines = reader.readlines()

ステートメントの下にインデントされたコードのブロックがwith終了するとすぐに (例外、 、ステートメントreturncontinueまたはbreak単にブロック内のすべてのコードの実行が終了したため)、readerファイル オブジェクトは閉じられます。

おまけのヒント: ファイル オブジェクトは iterable であるため、以下も機能します。

with codecs.open(somefile, 'r','utf8') as reader:
    lines = list(reader)

まったく同じ結果になります。

于 2013-07-01T07:38:36.073 に答える