在function-python中保存变量
我想将我在特定函数中创建的所有变量一次性保存到磁盘,以便以后加载它们。类似的东西:在function-python中保存变量,python,function,save,Python,Function,Save,我想将我在特定函数中创建的所有变量一次性保存到磁盘,以便以后加载它们。类似的东西: >>> def test(): a=1 b=2 save.to.file(filename='file', all.variables) >>> load.file('file') >>> a >>> 1 在python中有没有实现这一点的方法?我知道cPickle可以做到这一点,但据我所知,必须为每个
>>> def test():
a=1
b=2
save.to.file(filename='file', all.variables)
>>> load.file('file')
>>> a
>>> 1
在python中有没有实现这一点的方法?我知道cPickle可以做到这一点,但据我所知,必须为每个变量键入cPickle.dump(),而我的脚本有几十个。此外,cPickle似乎只存储变量的值,而不存储变量的名称,因此必须记住数据最初保存的顺序。您可以通过将多个变量设置为对象的属性或字典中的元素来pickle多个变量。无论哪种情况,它都会保存名称。它不像MATLAB中的保存那样方便,但它总比没有好。 如果你不满意“代码”>“泡菜< /代码>”的API,考虑哪一个更适合你的代码,比如“代码> DICT < /代码>——比如前端。 前 导入搁置 >>>f=搁置。打开('演示') >>>f >>>列表(f.keys()) ['test','example'] >>>del f[“测试”] >>>del f[“示例”] >>>列表(f.keys()) [] >>>f['a']=1 >>>列表(f.keys()) ['a'] >>>列表(f.items()) [('a',1)]
您可以使用pickle将对象存储在文件中:
>>> a = {'a': 1, 'b': 2, 'c': 3}
>>> a
{'a': 1, 'c': 3, 'b': 2}
>>>
>>> import pickle
>>> pickle.dump(a, open('a.dump', 'wb'))
>>>
>>> a = None
>>> a
>>>
>>> a = pickle.load(open('a.dump', 'rb'))
>>> a
{'a': 1, 'c': 3, 'b': 2}
>>>
更多信息请访问:假设您要保存的所有变量都是当前函数的本地变量,您可以通过函数获取它们。这几乎总是一个非常糟糕的主意,但它是可行的 例如:
def test():
a=1
b=2
pickle.dump(file, locals())
如果您打印局部变量(),您将看到它只是一个dict,每个局部变量都有一个键。因此,当您稍后加载pickle时,您将得到相同的dict。如果您想将其注入本地环境,您可以……但您必须非常小心。例如,此功能:
def test2():
locals().update(pickle.load(file))
print a
def pickle_filtered_dict(d, file):
for key, value in d.items():
pickle.dump((key, value), file)
except TypeError:
pass
def pickles(file):
try:
while True:
yield pickle.load(file)
except EOFError:
pass
def unpickle_filtered_dict(file):
return {key: value for key, value in pickles(file)}
…将被编译为希望a
是全局的,而不是本地的,因此您已更新本地a
的事实将不起作用
这只是这样做不好的原因之一
那么,正确的做法是什么
最简单的是,与其拥有一大堆变量,不如拥有一个包含大量键的dict。然后你可以腌制和拆开口述,一切都是琐碎的
或者,使用元组显式地pickle和unpickle所需的变量:
def test():
a = 1
b = 2
pickle.dump(file, (a, b))
def test2():
a, b = pickle.load(file)
print a
在一条评论中,你说你想对一堆或多个变量进行pickle处理,跳过任何不能进行pickle处理的变量 为了使事情更简单,假设您实际上只想pickle一个dict,跳过任何不能pickle的值。(以上内容应说明此解决方案仍然完全通用的原因。) 那么,您如何知道一个值是否可以被pickle?试图预测这是一个棘手的问题。即使您有一个包含所有可pickle类型的完美列表,也不会有什么帮助——一个充满整数的列表可以被pickle,但是一个充满绑定实例方法的列表却不能 这正是为什么(“请求原谅比获得许可更容易”)在Python之类的duck类型语言中是一个重要原则的原因。*找出是否可以对某些内容进行pickle的方法是对其进行pickle,并查看是否出现异常 下面是一个简单的演示:
def is_picklable(value):
try:
pickle.dumps(value)
except TypeError:
return False
else:
return True
def filter_dict_for_pickling(d):
return {key: value for key, value in d.items() if is_picklable((key, value))}
如果将整个存储过程放在包装器函数中,则可以使其更简洁、更高效:
def test2():
locals().update(pickle.load(file))
print a
def pickle_filtered_dict(d, file):
for key, value in d.items():
pickle.dump((key, value), file)
except TypeError:
pass
def pickles(file):
try:
while True:
yield pickle.load(file)
except EOFError:
pass
def unpickle_filtered_dict(file):
return {key: value for key, value in pickles(file)}
为什么不把整个功能都泡菜呢?您可以使用
test.a
或test.b
检索变量。@zhangyangyu:no。函数属性不是局部变量。为什么有几十个变量,每个都需要保存?在我看来,要么你使用了太多的变量,而列表之类的变量更合适,要么你试图保存所有内容,而不是考虑哪些内容需要保存,哪些内容应该在程序重新启动时重置或重建。谢谢,这正是我要找的。基本上,我只想将给定会话中的所有变量保存在一个文件中,以备将来参考(以防我需要返回并查看为哪些变量分配了哪些值)。但是有没有办法告诉pickle只保存那些“可pickle”的对象,或者告诉locals()不要保存那些“不可pickle”的对象(我收到一条错误消息-ValueError-由于这些原因)@user2635863:让我用一些可能对你的新问题有帮助的东西来更新答案。非常感谢你的清晰解释和演示。