4

ファイルを読んだ後、ファイルを閉じないことがよくあります

for line in open(FileName):
    # do something

また、同じプログラムでファイルを再度開きます。

for line in open(FileName):
    # do something else

私の質問は、このアプローチに欠点があるかどうかです。ファイルを開く必要があると主張する投稿を見たことがありますwith

with open(FileName) as fp:

しかし、このアプローチの利点は何ですか?

4

2 に答える 2

4

場合によっては、ファイルを閉じなくても悪影響が生じることがあります。for line in open("filename"):CPython (最も一般的な Python 実装) は、ファイルへのそれ以上の参照が存在しない場合、 を使用するとループの直後にファイルを閉じます。他の Python 実装では、ファイルのクローズが遅れる場合がありますが、最終的にはクローズされます。

ただし、いくつかの問題があります。

  1. ファイルへの非表示の参照が引き続き存在する場合があります。関数で例外がスローされた場合、例外に関連付けられたトレースバックには関数の実行フレームへの参照が含まれるため、すべてのローカル変数が引き続き存在します。これにより、CPython でも予想よりも長くファイルが開いたままになる可能性があります。

  2. ファイルが再び閉じられる時間を制御できないため、多くのファイルを開くと、ファイル記述子が不足する可能性があります。

  3. Python 3.2 以降ResourceWarningでは、閉じられていないすべてのファイルに対して a が発生します (この警告は無効にできますが、とにかく)。

要約すると、面倒なことをする価値はありません。常に を使用しwith、これらの問題は忘れてください。とにかくプログラミング中に覚えておくべきことは十分にあります。

于 2012-07-27T11:03:26.600 に答える
0

再利用with

を使用してファイルを開いたり管理したりする主な利点は、に関連付けられた「ブロック」を終了すると、ファイルwith自動的に閉じwithられることです。また、例外が発生した場合に備えて、ファイルも閉じられます。

ファイルを閉じないままにしておくと、プログラミングが乱雑になります。

特に、書き込み中のファイルの場合、閉じられていないファイルのすべてのバッファがフラッシュされていない可能性があるため、出力ファイルで期待したすべてのデータを取得できない場合があります(これはファイルを閉じるときに自動的に行われます)。 )、結果として部分的な出力ファイルのみになります。

したがって、ファイルを開くために使用する必要はありませんが、withファイルの管理が容易になり、ファイルのクローズも処理されます。つまり、心配することが1つ少なくなるため、この方法をお勧めします。

于 2012-07-27T10:59:01.697 に答える