本节内容
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_data q . |
③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 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、常用方法
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 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值获取
1
2
3
4
5
6
7
|
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。