我以这种方式保存了一个python字典:
import cPickle as pickle
pickle.dump(dictname, open("filename.pkl", "wb"))
我以这种方式将它加载到另一个脚本中:
dictname = pickle.load(open("filename.pkl", "rb"))
在此之后如何关闭文件?
我以这种方式保存了一个python字典:
import cPickle as pickle
pickle.dump(dictname, open("filename.pkl", "wb"))
我以这种方式将它加载到另一个脚本中:
dictname = pickle.load(open("filename.pkl", "rb"))
在此之后如何关闭文件?
最好使用一条with
语句,它在语句结束时关闭文件,即使发生异常:
with open("filename.pkl", "wb") as f:
pickle.dump(dictname, f)
...
with open("filename.pkl", "rb") as f:
dictname = pickle.load(f)
否则,文件只会在垃圾收集器运行时关闭,而何时发生这种情况是不确定的,几乎无法预测。
使用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
除非您真的处于泡菜中,否则您应该避免跟踪模块。
我猜人们只是想避免手动关闭文件。使用 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))