本节内容
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。