web-dev-qa-db-ja.com

python 2.4でファイルを安全に開く/閉じる方法

現在、Pythonを使用するサーバーの1つで使用する小さなスクリプトを作成しています。サーバーにはPython 2.4.4のみがインストールされています。

2.5がリリースされるまでPythonの使用を開始しなかったため、次のフォームに慣れています。

with open('file.txt', 'r') as f:
    # do stuff with f

ただし、2.5以前にはwithステートメントがなく、ファイルオブジェクトを手動でクリーンアップする適切な方法の例を見つけるのに苦労しています。

古いバージョンのpythonを使用する場合、ファイルオブジェクトを安全に破棄するためのベストプラクティスは何ですか?

80
TM.

docs.python.org を参照してください:

ファイルの処理が完了したら、f.close()を呼び出してファイルを閉じ、開いているファイルによって占有されているシステムリソースを解放します。 f.close()を呼び出した後、ファイルオブジェクトを使用しようとすると、自動的に失敗します。

したがって、try/finallyclose()をエレガントに使用します。

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
    f.close()

これにより、# do stuff with fが例外を発生させた場合でも、fは適切に閉じられます。

opentryの-​​outsideに表示されることに注意してください。 open自体が例外を発生させる場合、ファイルは開かれていなかったため、閉じる必要はありません。また、openが例外を発生させた場合、その結果はnotに割り当てられ、fになり、f.close()を呼び出すのはエラーになります。

133
Jon-Eric

上記のソリューションでは、ここで繰り返しました。

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
   f.close()

ファイルを正常に開いた後、試行する前に何か悪いことが起こった場合(あなたは決して知らない...)、ファイルは閉じられないので、より安全な解決策は:

f = None
try:
    f = open('file.txt', 'r')

    # do stuff with f

finally:
    if f is not None:
       f.close()
32
mljrg

以下を使用する場合、ドキュメントに従ってファイルを閉じる必要はありません。

ファイルオブジェクトを処理する場合は、withキーワードを使用することをお勧めします。これには、途中で例外が発生した場合でも、スイートの終了後にファイルが適切に閉じられるという利点があります。また、同等のtry-finallyブロックを記述するよりもはるかに短くなります。

>>> with open('workfile', 'r') as f:
...     read_data = f.read()
>>> f.closed
True

詳細: https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

2
user3765030