python(6)- shelve模块

时间:2022-07-07 10:03:03

前面学习了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来获取数据。