shelve是一个简单的数据存储方案,类似key-value数据库,可以很方便的保存python对象,其内部是通过pickle协议来实现数据序列化。shelve只有一个open()函数,这个函数用于打开指定的文件(一个持久的字典),然后返回一个shelf对象。shelf是一种持久的、类似字典的对象。它与“dbm”的不同之处在于,其values值可以是任意基本Python对象--pickle模块可以处理的任何数据。这包括大多数类实例、递归数据类型和包含很多共享子对象的对象。keys还是普通的字符串。
open(filename, flag='c', protocol=None, writeback=False)
'r':以只读模式打开一个已经存在的数据存储文件
'w':以读写模式打开一个已经存在的数据存储文件
'c':以读写模式打开一个数据存储文件,如果不存在则创建
'n':总是创建一个新的、空数据存储文件,并以读写模式打开
protocol 参数表示序列化数据所使用的协议版本,默认是pickle v3;
writeback 参数表示是否开启回写功能
实例:内置数据类型操作
# 保存数据 with shelve.open('student') as db: db['name'] = 'Tom' db['age'] = 19 db['hobby'] = ['篮球', '看电影', '弹吉他'] db['other_info'] = {'sno': 1, 'addr': 'xxxx'} # 读取数据 with shelve.open('student') as db: for key,value in db.items(): print(key, ': ', value)
实例:自定义数据类型操作
# 自定义class class Student(object): def __init__(self, name, age, sno): self.name = name self.age = age self.sno = sno def __repr__(self): return 'Student [name: %s, age: %d, sno: %d]' % (self.name, self.age, self.sno) # 保存数据 tom = Student('Tom', 19, 1) jerry = Student('Jerry', 17, 2) with shelve.open("stu.db") as db: db['Tom'] = tom db['Jerry'] = jerry # 读取数据 with shelve.open("stu.db") as db: print(db['Tom']) print(db['Jerry'])
import shelve f = shelve.open("shelve_test.db") f.update({'k1':'v1','k2':'v2'}) f['k3'] = "v3" for i in f.keys(): print(i) f.close()
输出:
k1
k3
k2