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

use*_*420 12 python pickle data-dictionary

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

import cPickle as pickle

pickle.dump(dictname, open("filename.pkl", "wb"))
Run Code Online (Sandbox Code Playgroud)

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

dictname = pickle.load(open("filename.pkl", "rb"))
Run Code Online (Sandbox Code Playgroud)

怎么可能在此之后关闭文件?

Ada*_*eld 33

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

with open("filename.pkl", "wb") as f:
    pickle.dump(dictname, f)
...
with open("filename.pkl", "rb") as f:
    dictname = pickle.load(f)
Run Code Online (Sandbox Code Playgroud)

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


Mik*_*rns 8

使用该with语句是更好的方法,但恰恰相反,如果你不使用with,你应该保留一个文件句柄......并从那里关闭.

f = open('filename.pkl', 'wb')
pickle.dump(dictname, f)
f.close()
Run Code Online (Sandbox Code Playgroud)

在另一个脚本中:

f = open('filename.pkl','rb')
dictname = pickle.load(f)
f.close()
Run Code Online (Sandbox Code Playgroud)

这基本上with就是为你做的.

但是......如果你被困(无论出于什么原因),你最初发布的代码,并回答你的原始问题......是的,垃圾收集器将在未来某个未指定的时间为你关闭它.或者您可以使用该gc模块跟踪对文件对象的引用,然后将其关闭.有一些代码可以帮助你做到这一点,例如:https: //github.com/uqfoundation/dill/blob/master/dill/pointers.py

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