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

148 投票
7 回答
272977 浏览
提问于 2025-04-16 20:46

我需要把大约十几个对象保存到一个文件里,然后再把它们恢复出来。
我试着用循环和pickle、shelve来做,但效果不太好。

补充一下。
我之前没提到的是,我想保存的所有对象都是同一个类的,我没意识到其实可以直接这样保存整个类:

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'

7 个回答

14

保存多个变量到一个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
60

有一个内置的库叫做 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()
226

如果你需要保存多个对象,可以简单地把它们放在一个列表或者元组里,比如:

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)

如果你有很多数据,可以通过在调用 dump() 时加上 protocol=-1 来减小文件的大小;这样 pickle 就会使用最佳的协议,而不是默认的旧协议(旧协议更兼容以前的版本)。在这种情况下,文件必须以二进制模式打开(分别是 wbrb)。

在使用 Python 3 时,也应该使用二进制模式,因为它的默认协议会生成二进制数据(也就是非文本数据),写入模式是 'wb',读取模式是 'rb'

撰写回答