day5-shelve模块

一、简述

   之前我们说不管是json也好,还是pickle也好,在python3中只能dump一次和load一次,不能dump多次,和load多次,但是我们真想要dump多次和load多次怎么办呢,并且能事项数据的持久化呐?好吧,今天我们就来说说这个shelve模块。

二、shelve概念

1、持久化

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内容

'test', (0, 50)
'func', (1024, 24)
'info', (512, 48)

②shelve_test.dat内容

�]q (X   testqX   zhangqX   qiqX   gaoqe. 
�}q (X   nameqX
   zhangqigaoqX   ageqKu.
�c__main__
stu_data
q .

 ③shelve_test.bak内容

'test', (0, 50)
'func', (1024, 24)
'info', (512, 48)

 2、解析文件内容

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、常用方法

>>> 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:序列化对象})

#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值获取

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。
posted @ 2017-04-06 10:19  帅丶高高  阅读(369)  评论(0编辑  收藏  举报