python(6)- shelve模块

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

posted @ 2016-03-22 12:37  黄小墨  阅读(410)  评论(0编辑  收藏  举报