一、在已有json和pickle的情况下,为什么用shelve?
使用json或者 pickle 持久化数据,能 dump 多次,但 load 的话只能取到最新的 dump,因为先前的数据已经被后面 dump 的数据覆盖掉了。如果想要实现 dump 多次不被覆盖,可以使用 shelve 模块。
二、shelve模块的特点
shelve 是一个简单的数据存储方案,类似 key-value 数据库,可以很方便的保存 python 对象,其内部是通过 pickle 协议来实现数据序列化。shelve 只有一个 open() 函数,这个函数用于打开指定的文件(一个持久的字典),然后返回一个 shelf 对象。shelf 是一种持久的、类似字典的对象。
- shelve 模块可以看做是 pickle 模块的升级版,可以持久化所有 pickle 所支持的数据类型,而且 shelve 比 pickle 提供的操作方式更加简单、方便;
- 在 shelve 模块中,key 必须为字符串,而值可以是 python 所支持的数据类型。
- shelve 只提供给我们一个 open 方法,是用 key 来访问的,使用起来和字典类似。可以像字典一样使用get来获取数据等。
- shelve 模块其实用 anydbm 去创建DB并且管理持久化对象的。
三、shelve模块的用法
1、持久化存储
import shelve
def member_info(name, age):
print("Member info:", name, age)
name = ['Jack', 'Maxwell', 'Tom']
info = {'name':'Maxwell', 'age':18}
with shelve.open('demo') as data:
data['name'] = name #持久化列表
data['info'] = info #持久化字典
data['func'] = member_info
代码执行后会在当前目录下生成三个文件:
其中 demo.bak 和 demo.dir 文件内容相同,三个文件的内容显示如下:
demo.bak 和 demo.dir 的文件内容:
'name', (0, 43)
'info', (512, 45)
'func', (1024, 27)
demo.dat 的文件内容:
€]q (X JackqX MaxwellqX Tomqe. Alexqe.