私が次のことをした場合:
import codecs
lines = codecs.open(somefile, 'r','utf8').readlines()
初期化していないファイルを閉じる方法はありますか? もしそうなら、どのように?通常、私はできたはずです:
import codecs
reader = codecs.open(somefile, 'r','utf8')
lines = reader.readlines()
reader.close()
CPython では、参照カウントが返された直後の 0 になると、ファイル オブジェクトは自動的に閉じ.readlines()
ます。他の Python 実装では、使用されるガベージ コレクション アルゴリズムによっては、もう少し時間がかかる場合があります。ファイルは、プログラムの終了までに確実に閉じられます。
実際には、ファイル オブジェクトをコンテキスト マネージャーとして使用し、with
ステートメント呼び出しを閉じる必要があります。
with codecs.open(somefile, 'r','utf8') as reader:
lines = reader.readlines()
ステートメントの下にインデントされたコードのブロックがwith
終了するとすぐに (例外、 、ステートメントreturn
、continue
またはbreak
単にブロック内のすべてのコードの実行が終了したため)、reader
ファイル オブジェクトは閉じられます。
おまけのヒント: ファイル オブジェクトは iterable であるため、以下も機能します。
with codecs.open(somefile, 'r','utf8') as reader:
lines = list(reader)
まったく同じ結果になります。