我以这种方式保存了一个python字典:
import cPickle as pickle
pickle.dump(dictname, open("filename.pkl", "wb"))
我以这种方式将其加载到另一个脚本中:
dictname = pickle.load(open("filename.pkl", "rb"))
如何在此之后关闭文件?
答案 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
但是,with
和f.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))