本节内容
1、简述
2、shelve概念
3、shelve模块使用
4、总结
一、简述
之前我们说不管是json也好,还是pickle也好,在python3中只能dump一次和load一次,不能dump多次,和load多次,但是我们真想要dump多次和load多次怎么办呢,并且能事项数据的持久化呐?好吧,今天我们就来说说这个shelve模块。
二、shelve概念
1、持久化
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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内容
|
1
2
3
|
'test', (0, 50)'func', (1024, 24)'info', (512, 48) |
②shelve_test.dat内容
|
1
2
3
4
5
6
|
�]q (X testqX zhangqX qiqX gaoqe.�}q (X nameqX zhangqigaoqX ageqKu.�c__main__stu_dataq . |
③shelve_test.bak内容
|
1
2
3
|
'test', (0, 50)'func', (1024, 24)'info', (512, 48) |
2、解析文件内容
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import shelvedef 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 22None |
三、shelve模块使用
3.1、常用方法
|
1
2
3
4
5
6
7
8
9
10
11
12
|
>>> 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:序列化对象})
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#dumps到文件中import shelveinfo = { "name":"zhangqigao", "age":18}with shelve.open("shelve_test") as d: d['qigaotest'] = info #变量存在 d.update({'qigaotest':"shuaigaogao"}) #更新已经key为"qigaotest"的值#loads到内存中import shelvewith shelve.open("shelve_test") as f: print(f.get("qigaotest"))#输出shuaigaogao |
3.3、get
说明:把文件中的值load到内存中时,通过get它的key值获取
|
1
2
3
4
5
6
7
|
import shelvewith 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。