web-dev-qa-db-ja.com

pythonのpickle.load()の後にファイルを閉じる方法

python辞書を次のように保存しました:

import cPickle as pickle

pickle.dump(dictname, open("filename.pkl", "wb"))

そして、この方法で別のスクリプトにロードします。

dictname = pickle.load(open("filename.pkl", "rb"))

この後、どのようにしてファイルを閉じることができますか?

12
user2961420

代わりに withステートメント を使用することをお勧めします。これにより、例外が発生した場合でも、ステートメントの終了時にファイルが閉じられます。

with open("filename.pkl", "wb") as f:
    pickle.dump(dictname, f)
...
with open("filename.pkl", "rb") as f:
    dictname = pickle.load(f)

それ以外の場合、ファイルはガベージコレクターが実行されたときにのみ閉じられ、それが発生したときは不確定であり、予測することはほとんど不可能です。

33
Adam Rosenfield

withステートメントを使用するのがより良いアプローチですが、逆に、withを使用しなかった場合は、ファイルハンドルを保持し、そこから閉じる必要があります。

_f = open('filename.pkl', 'wb')
pickle.dump(dictname, f)
f.close()
_

および他のスクリプト:

_f = open('filename.pkl','rb')
dictname = pickle.load(f)
f.close()
_

これは基本的にwithがあなたのために行っていることです。

ただし、(何らかの理由で)最初に投稿したコードで行き詰まり、元の質問に答える場合は…はい、ガベージコレクターは将来の不特定の時間にコードを閉じます。または、gcモジュールを使用してファイルオブジェクトへの参照を追跡し、それを閉じることもできます。これを行うのに役立つ可能性のあるコードがいくつかあります。例: https://github.com/uqfoundation/dill/blob/master/dill/pointers.py

ただし、withf.close()の方がはるかに好ましいため、実際にピクルスになっている場合を除いて、gcモジュールをトレースすることは避けてください。

8
Mike McKerns