如何在python中的pickle.load()之后关闭文件

时间:2013-11-20 16:11:15

标签: python pickle data-dictionary

我以这种方式保存了一个python字典:

import cPickle as pickle

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

我以这种方式将其加载到另一个脚本中:

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

如何在此之后关闭文件?

3 个答案:

答案 0 :(得分:30)

最好使用with statement,它会在语句结束时关闭文件,即使发生异常:

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

否则,该文件只会在垃圾收集器运行时关闭,并且当发生这种情况时是不确定的,几乎无法预测。

答案 1 :(得分:7)

使用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模块中进行跟踪,除非您确实处于挑剔状态。

答案 2 :(得分:0)

我想人们只是想避免手动关闭文件。使用pickle.loads()/ dumps()和pathlib方法可以做到:

import pickle
import pathlib # Must be Python 3.5 or above

# one line to load pkl, auto closing file
data = pickle.loads(pathlib.Path('path/to/pkl').read_bytes())

# also one line to dump, auto closing file
pathlib.Path('path/to/save').write_bytes(pickle.dumps(data))