如何在 python 中保存和恢复多个变量?

我需要将大约12个对象保存到一个文件中,然后在以后恢复它们。 我曾试图使用一个 for 循环与 pickle 和搁置,但它不工作的权利。

剪辑。
我试图保存的所有对象都在同一个类中(我之前应该提到这一点) ,我没有意识到我可以像这样保存整个类:

import pickle
def saveLoad(opt):
global calc
if opt == "save":
f = file(filename, 'wb')
pickle.dump(calc, f, 2)
f.close
print 'data saved'
elif opt == "load":
f = file(filename, 'rb')
calc = pickle.load(f)
else:
print 'Invalid saveLoad option'
244318 次浏览

您应该查看 搁置泡菜模块。如果需要存储大量数据,最好使用数据库

有一个内置的库称为 pickle。使用 pickle你可以转储对象到一个文件,并加载它们以后。

import pickle


f = open('store.pckl', 'wb')
pickle.dump(obj, f)
f.close()


f = open('store.pckl', 'rb')
obj = pickle.load(f)
f.close()

如果需要保存多个对象,可以简单地将它们放在一个列表或元组中,例如:

import pickle


# obj0, obj1, obj2 are created here...


# Saving the objects:
with open('objs.pkl', 'w') as f:  # Python 3: open(..., 'wb')
pickle.dump([obj0, obj1, obj2], f)


# Getting back the objects:
with open('objs.pkl') as f:  # Python 3: open(..., 'rb')
obj0, obj1, obj2 = pickle.load(f)

如果有大量数据,可以通过将 protocol=-1传递给 dump()来减小文件大小; 然后,pickle将使用可用的最佳协议,而不是默认的历史(并且更向后兼容)协议。在这种情况下,文件必须以二进制模式(分别为 wbrb)打开。

二进制模式也应该与 Python3一起使用,因为它的默认协议产生二进制(即非文本)数据(写模式 'wb'和读模式 'rb')。

可以使用 klepto,它为内存、磁盘或数据库提供持久缓存。

dude@hilbert>$ python
Python 2.7.6 (default, Nov 12 2013, 13:26:39)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from klepto.archives import file_archive
>>> db = file_archive('foo.txt')
>>> db['1'] = 1
>>> db['max'] = max
>>> squared = lambda x: x**2
>>> db['squared'] = squared
>>> def add(x,y):
...   return x+y
...
>>> db['add'] = add
>>> class Foo(object):
...   y = 1
...   def bar(self, x):
...     return self.y + x
...
>>> db['Foo'] = Foo
>>> f = Foo()
>>> db['f'] = f
>>> db.dump()
>>>

然后,在解释器重新启动后..。

dude@hilbert>$ python
Python 2.7.6 (default, Nov 12 2013, 13:26:39)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from klepto.archives import file_archive
>>> db = file_archive('foo.txt')
>>> db
file_archive('foo.txt', {}, cached=True)
>>> db.load()
>>> db
file_archive('foo.txt', {'1': 1, 'add': <function add at 0x10610a0c8>, 'f': <__main__.Foo object at 0x10510ced0>, 'max': <built-in function max>, 'Foo': <class '__main__.Foo'>, 'squared': <function <lambda> at 0x10610a1b8>}, cached=True)
>>> db['add'](2,3)
5
>>> db['squared'](3)
9
>>> db['f'].bar(4)
5
>>>

拿到密码: Https://github.com/uqfoundation

下列方法似乎很简单,可用于不同大小的变量:

import hickle as hkl
# write variables to filename [a,b,c can be of any size]
hkl.dump([a,b,c], filename)


# load variables from filename
a,b,c = hkl.load(filename)

将多个变量保存到 pickle 文件的另一种方法是:

import pickle


a = 3; b = [11,223,435];
pickle.dump([a,b], open("trial.p", "wb"))


c,d = pickle.load(open("trial.p","rb"))


print(c,d) ## To verify