Python2.4でファイルを安全に開閉する方法


86

私は現在、Pythonを使用してサーバーの1つで使用するための小さなスクリプトを書いています。サーバーにはPython2.4.4のみがインストールされています。

2.5がリリースされるまでPythonを使い始めなかったので、次の形式に慣れています。

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

ただし、with2.5より前のステートメントはなく、ファイルオブジェクトを手動でクリーンアップする適切な方法の例を見つけるのに問題があります。

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

回答:


139

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

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

したがって、close()エレガントに使用してtry/finallyください:

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

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

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

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


とてもシンプルです、ありがとう。どういうわけか、もっと複雑なものが必要だと思っていました。
TM。

16
場合はopen失敗する前に、例外が発生しますtry/finallyブロックがさえ入力されています。したがってclose、呼び出されません。(そのためopen、前に電話する必要がありますtry。)
FogleBird 2010

1
@TMopen例外の発生に関するメモを追加しました。
Jon-Eric

4
これは、withステートメントが舞台裏で変換するものです。
Arlaharen 2010

1
ファイルを開くには、試行内に行う必要があります。
Anthony Rutledge 2017年

32

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

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()

with open(...)ステートメントを使用すると、withブロックがどのように終了しても(例外を除いて)ファイルが閉じられます
darkgaze 2018

@darkgazewith open(...)は間違いなく現代のPythonで最良の選択です。
mljrg 2018

11

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

ファイルオブジェクトを処理するときは、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


これは正しく、質問に気づいていません。
ジョンエリック

-4

使用方法openと「python」の例を次に示します。close

from sys import argv
script,filename=argv
txt=open(filename)
print "filename %r" %(filename)
print txt.read()
txt.close()
print "Change the file name"
file_again=raw_input('>')
print "New file name %r" %(file_again)
txt_again=open(file_again)
print txt_again.read()
txt_again.close()

ファイルを開いた回数は、その回数を閉じる必要があります。


1
open前後に例外が発生した場合、closeこのアプローチを使用してファイルを適切に閉じることはできません。withまたはtry/を使用finallyすると、例外が存在する場合でもファイルが適切に閉じられます。
ジョンエリック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.