在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:让我用一些可能对你的新问题有帮助的东西来更新答案。非常感谢你的清晰解释和演示。