前面学习了pickle,这两个可以将数据持久化存储到硬盘上,在实际应用中,我们可能会多次将数据dump到同一文件里,试一下:
import pickle data = {'k1':123, 'k2':123} data1 = {'d1':111, 'd2':222} #先dump一次 with open('data.pkl', 'wb') as f: pickle.dump(data, f) #使用追加模式再dump一次 with open('data.pkl', 'ab') as f: pickle.dump(data1, f) #先读取一次 with open('data.pkl', 'rb') as f: data_first = pickle.load(f) print(data_first)
先执行一下,看看结果:
{'k1': 123, 'k2': 123}
将第一次dump的结果读取出来了。
那我们再读取一次
#先读取一次 with open('data.pkl', 'rb') as f: data_first = pickle.load(f) data_second = pickle.load(f) print(data_first) print(data_second)
执行结果
{'k1': 123, 'k2': 123} {'d1': 111, 'd2': 222}
由此可以得知,第一次读取的是第一次dump的数据,第二次读取的是第二次dump的数据,那第n次读取的就是第n次dump的数据. 那如果dump次数多了之后,根本就不可能知道,每次dump的内容是什么。而shelve 的作用就是让你知道你每次dump的是什么!
import shelve f = shelve.open("shelve_test") class Test(object): def __init__(self, n): self.n = n #两个类的实例 t = Test(123) t2 = Test(112233) #再定义一个列表 name = ["alex", 'rain', 'jack'] f["test"] = name #持久化列表,'test'是我们给这次序列化取的名字,shelve内部实际上是key,vaule结构,test就是key f["t1"] = t #持久化类 f["t2"] = t2 f.close() #关闭 #反序列化 也可以用with shelve.open 方式 with shelve.open("shelve_test") as f: a = f['test'] b = f['t1'] c = f['t2'] print(a) print(b.n) print(c.n)
shelve内部是key, value结构,在每次序列化时定义一个名字(即key),这样我们就能方便的根据key来获取数据。