函数和常用模块【day06】:shelve模块(五)

本节内容

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

四、总结

  1. shelve模块是一个简单的key,value将内存数据通过文件持久化的模块。
  2. shelve模块可以持久化任何pickle可支持的python数据格式。
  3. shelve就是pickle模块的一个封装。
  4. shelve模块是可以多次dump和load。

猜你喜欢

转载自www.cnblogs.com/luoahong/p/9890481.html