18

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

import cPickle as pickle

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

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

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

在此之后如何关闭文件?

4

3 回答 3

48

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

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

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

于 2013-11-20T16:13:21.103 回答
10

使用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

但是,with并且f.close()更受欢迎,gc除非您真的处于泡菜中,否则您应该避免跟踪模块。

于 2014-06-11T21:05:35.623 回答
1

我猜人们只是想避免手动关闭文件。使用 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))
于 2020-08-03T09:20:08.567 回答