day5-shelve模块
一、简述
之前我们说不管是json也好,还是pickle也好,在python3中只能dump一次和load一次,不能dump多次,和load多次,但是我们真想要dump多次和load多次怎么办呢,并且能事项数据的持久化呐?好吧,今天我们就来说说这个shelve模块。
二、shelve概念
1、持久化
import shelve #导入shelve模块 def stu_data(name,age): #定义一个函数 print("register stu:",name,age) name = ["test","zhang","qi","gao"] #定义一个列表 info = { "name":"zhangqigao","age":18} #定义一个字典 with shelve.open("shelve_test") as d: d["test"] = name #持久化列表 d["info"] = info #持久化字典 d["func"] = stu_data #持久化函数
代码执行结果:
生成三个文件夹,分别是:shelve_test.dir、shelve_test.dat、shelve_test.bak
①shelve_test.dir内容
'test', (0, 50) 'func', (1024, 24) 'info', (512, 48)
②shelve_test.dat内容
�]q (X testqX zhangqX qiqX gaoqe. �}q (X nameqX zhangqigaoqX ageqKu. �c__main__ stu_data q .
③shelve_test.bak内容
'test', (0, 50) 'func', (1024, 24) 'info', (512, 48)
2、解析文件内容
import shelve def stu_data(name,age): #这边一定要定义相同名字的函数,不然执行报错 print("stu:",name,age) with shelve.open("shelve_test") as f: print(f['test']) #解析列表 print(f['info']) #解析字典 print(f["func"]("zhangqsan",22)) #解析函数 #输出 ['test', 'zhang', 'qi', 'gao'] {'age': 18, 'name': 'zhangqigao'} stu: zhangqsan 22 None
三、shelve模块使用
3.1、常用方法
>>> import shelve >>> d = shelve.open("shelve_test") >>> dir(d) ['_MutableMapping__marker', '__abstractmethods__', '__class__', '__contains__', '__del__', '__delattr__', '__delitem__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '__weakref__', '_abc_cache', '_abc_negative_cache', '_abc_negative_cache_version', '_abc_registry', '_protocol', 'cache', 'clear', 'close', 'dict', 'get', 'items', 'keyencoding', 'keys', 'pop', 'popitem', 'setdefault', 'sync', 'update', 'values', 'writeback']
3.2、update
说明:update方法是如果序列化的值存在,则更新,如果不存在,则新增,用法:update({key:序列化对象})
#dumps到文件中 import shelve info = { "name":"zhangqigao", "age":18 } with shelve.open("shelve_test") as d: d['qigaotest'] = info #变量存在 d.update({'qigaotest':"shuaigaogao"}) #更新已经key为"qigaotest"的值 #loads到内存中 import shelve with shelve.open("shelve_test") as f: print(f.get("qigaotest")) #输出 shuaigaogao
3.3、get
说明:把文件中的值load到内存中时,通过get它的key值获取
import shelve with shelve.open("shelve_test") as f: print(f.get("qigaotest")) #或者是f["qigaotest"] #输出 shuaigaogao
注意:如果是通过f["qigaotest"]这种方法取,如果值不存在则会报错,通过get去取,不存在,则会返回none
四、总结
- shelve模块是一个简单的key,value将内存数据通过文件持久化的模块。
- shelve模块可以持久化任何pickle可支持的python数据格式。
- shelve就是pickle模块的一个封装。
- shelve模块是可以多次dump和load。