函式和常用模組【day06】:shelve模組(五)
阿新 • • 發佈:2018-11-01
本節內容
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。