私は頻繁にpythonに似たコードを見る
for line in open(filename):
do_something(line)
ファイル名はいつこのコードで閉じられますか?
書くほうがいいですか
with open(filename) as f:
for line in f.readlines():
do_something(line)
filename
は、スコープから外れると閉じられます。これで通常はメソッドの終わりです。
はい、with
を使用することをお勧めします。
ファイルオブジェクトを取得したら、このオブジェクトのメソッドを呼び出して、すべてのファイルI/Oを実行します。 [...]ファイルの使用を終えたら、オブジェクトの
close
メソッドを呼び出して、ファイルへの接続を閉じることで終了する必要があります。input.close()
Pythonは、ガベージコレクション中にファイルオブジェクトが再要求されると自動的にファイルを閉じます。メインストリームのPythonは、ファイルはすぐに閉じられますが、他の重要なPython実装(JythonやIronPythonなど)には、他のより緩やかなガベージコレクション戦略があります)にもかかわらず、ファイルを閉じることは良いプログラミング方法ですできるだけ早く、特に大規模なプログラムではそれが適切です。そうしないと、無用に開いているファイルが大量に存在するリスクが高まる可能性があります。
try
/finally
は、キャッチされない例外のために関数が終了した場合でも、ファイルが閉じられるようにするのに特に適しています。
with
の部分は、後でファイルを閉じるため、適切です。 readlines()
を使用する必要さえありません。 for line in file
で十分です。
最初のものはそれを閉じるとは思わない。
.readlines()
をドロップします。これは冗長であり、(メモリ消費のため)大きなファイルには望ましくありません。 'with'
ブロックを持つバリアントは常にファイルを閉じます。
with open(filename) as file_:
for line in file_:
do_something(line)
裸の'for'
- loopバリアントでファイルが閉じられるタイミングは、Python実装に依存します。
pythonはガベージコレクションされます-cpythonには参照カウントとバックアップサイクル検出ガベージコレクタがあります。
削除/ファイナライズされると、ファイルオブジェクトはファイルハンドルを閉じます。
したがって、ファイルは最終的に閉じられ、cpythonではforループが終了するとすぐに閉じられます。