一、概述

前面章节我们讲述了json和pickle模块的序列化和反序列化处理,他们有一个不足是在python 3中不能多次dump和load,shelve模块则可以规避这个问题。
shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式,是pickle 更上一层的封装。

二、shelve模块的用法

Shelve模块提供了基本的存储操作,Shelve中的open函数在调用的时候返回一个shelf对象,通过该对象可以存储内容,即像操作字典一样进行存储操作。当在该对象中查找元素时,对象会根据已经存储的版本进行重新构建,当给某个键赋值的时候,元素会被存储。

  • 持久化存储

      1 import shelve
      2
      3 def member_info(name, age):
      4     print("Member info:", name, age)
      5
      6 name = ['Jack', 'Maxwell', 'Tom']
      7 info = {'name':'Maxwell', 'age':18}
      8
      9 with shelve.open('shelve_demo') as data:
     10     data['name'] = name
     11     data['info'] = info
     12     data['func'] = member_info

    代码执行后会生成三个文件:

    其中shelve_demo.bak和shelve_demo.dir文件内容相同,显示如下:

      1 'name', (0, 43)
      2 'info', (512, 45)
      3 'func', (1024, 27)

    shelve_demo.dat猜测为类数据库文件把。

  • 解析文件内容
      1 import shelve
      2
      3 def member_info(name, age):
      4     print("Member info:", name, age)
      5
      6 with shelve.open('shelve_demo') as data:
      7     print(data['name'])    #这里的key与之前保存的文件内容里面的key完全对应,否则会报错
      8     print(data['info'])
      9     print(data['func']('Alex', 22))
     10
     11 #运行结果输出:
     12 ['Jack', 'Maxwell', 'Tom']
     13 {'name': 'Maxwell', 'age': 18}
     14 Member info: Alex 22
     15 None

  • value值的修改
    一般情况下,我们通过shelve来open一个对象后,只能进行一次赋值处理,赋值后不能再次更新处理。

      1 import shelve
      2
      3 def member_info(name, age):
      4     print("Member info:", name, age)
      5
      6 name = ['Jack', 'Maxwell', 'Tom']
      7 info = {'name':'Maxwell', 'age':18}
      8
      9 with shelve.open('shelve_demo') as data:
     10     data['name'] = name
     11     data['info'] = info
     12     data['name'].append('Alex')
     13     print(data['name'])
     14
     15 程序输出:
     16 ['Jack', 'Maxwell', 'Tom']  #第一次赋值后apend的元素并没有生效

    再次open打开结果也是这样:

      1 import shelve
      2
      3 def member_info(name, age):
      4     print("Member info:", name, age)
      5
      6 name = ['Jack', 'Maxwell', 'Tom']
      7 info = {'name':'Maxwell', 'age':18}
      8
      9
     10 with shelve.open('shelve_demo') as data:
     11     print(data['name'])

    造成上述情况的原因是:我们只是修改了shelve对象的副本,而它并木有被最终保存。此时我们除了下文要讲述的update方法外,还有以下两种方法:
    方法一: shelve open一个对象后,先用临时变量指向对象副本,在临时变量上修改后让对象副本再次指向临时变量,从而覆盖保存对象副本。这种方法的本质是对open后的对象重新赋新值,并非在原有基础上进行update,也就是open后的对象内存指向地址发生了变化。

      1 import shelve
      2
      3 def member_info(name, age):
      4     print("Member info:", name, age)
      5
      6 name = ['Jack', 'Maxwell', 'Tom']
      7 info = {'name':'Maxwell', 'age':18}
      8
      9 with shelve.open('shelve_demo') as data:
     10     data['name'] = name
     11     data['info'] = info
     12     temp = data['name']  #这里的关键点在于对临时变量的使用
     13     temp.append('Alex')
     14     data['name'] = temp
     15     print(data['name'])
     16
     17 程序输出:
     18 ['Jack', 'Maxwell', 'Tom', 'Alex']

    方法二:借助open的writeback=True参数来实现,默认情况下该参数的值为False。

      1 import shelve
      2
      3 def member_info(name, age):
      4     print("Member info:", name, age)
      5
      6 name = ['Jack', 'Maxwell', 'Tom']
      7 info = {'name':'Maxwell', 'age':18}
      8
      9 with shelve.open('shelve_demo', writeback=True) as data:
     10     data['name'] = name
     11     data['info'] = info
     12     data['name'].append('Alex')
     13     print(data['name'])
     14
     15 程序输出:
     16 ['Jack', 'Maxwell', 'Tom', 'Alex']

  • update方法
    value值的更新还有一个update方法,使用起来也比较方便:

      1 import shelve
      2
      3 def member_info(name, age):
      4     print("Member info:", name, age)
      5
      6 name = ['Jack', 'Maxwell', 'Tom']
      7 info = {'name':'Maxwell', 'age':18}
      8
      9 with shelve.open('shelve_demo', writeback=True) as data:
     10     data['name'] = name
     11     data['info'] = info
     12     data.update({'name':['Jack', 'Maxwell', 'Tom', 'Alex']})  #这里也是重新赋值
     13     print(data['name'])
     14
     15 程序输出:
     16 ['Jack', 'Maxwell', 'Tom', 'Alex']

    重新load一下看看结果:

      1 import shelve
      2
      3 def member_info(name, age):
      4     print("Member info:", name, age)
      5
      6 name = ['Jack', 'Maxwell', 'Tom']
      7 info = {'name':'Maxwell', 'age':18}
      8
      9
     10 with shelve.open('shelve_demo') as data:
     11     print(data['name'])
     12
     13 程序输出:
     14 ['Jack', 'Maxwell', 'Tom', 'Alex']

  • get方法
    通过shelve.open反序列化load对象到内存后,可以通过get方法来获取key对应的value:

      1 __author__ = 'Maxwell'
      2
      3 import shelve
      4
      5 def member_info(name, age):
      6     print("Member info:", name, age)
      7
      8 name = ['Jack', 'Maxwell', 'Tom']
      9 info = {'name':'Maxwell', 'age':18}
     10
     11
     12 with shelve.open('shelve_demo') as data:
     13     print(data.get('name'))
     14
     15 程序输出:
     16 ['Jack', 'Maxwell', 'Tom', 'Alex']

三、总结

shelve概念总结:

  • shelve模块可以看做是pickle模块的升级版,因为shelve使用的就是pickle的序列化协议,但是shelve比pickle提供的操作方式更加简单、方便。
  • shelve模块相对于其它两个模块在将Python数据持久化到本地磁盘时有一个很明显的优点就是,它允许我们可以像操作dict一样操作被序列化的数据,而不必一次性的保存或读取所有数据。
  • shelve模块持久化支持更多的python数据类型

使用建议:

  1. 需要与外部系统交互时用json模块;
  2. 需要将少量、简单Python数据持久化到本地磁盘文件时可以考虑用pickle模块;
  3. 需要将大量Python数据持久化到本地磁盘文件或需要一些简单的类似数据库的增删改查功能时,可以考虑用shelve模块。

以上内容摘自大神博客http://www.cnblogs.com/yyds/p/6563608.html

转载于:https://www.cnblogs.com/linupython/p/8273858.html

day5-shelve模块相关推荐

  1. 序列化模块--json模块--pickle模块-shelve模块

    什么叫序列化? 序列化是指把内存里的数据类型转变成字符串,以使其能存储到硬盘或通过网络传播到远程,因为硬盘或网络传输时只能接受bytes 例: 把内存数据 转成字符 # data ={# 'roles ...

  2. python常用模块之shelve模块

    python常用模块之shelve模块 shelve模块是一个简单的k,v将内存中的数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据类型 我们在上面讲json.pickle ...

  3. python三十六:shelve模块

    shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写.key必须为字符串,而值可以是python所支持的数据类型. import shelvef = shelve ...

  4. (十四)json、pickle与shelve模块

    任何语言,都有自己的数据类型,那么不同的语言怎么找到一个通用的标准? 比如,后端用Python写的,前端是js,那么后端如果传一个dic字典给前端,前端肯定不认. 所以就有了序列化这个概念. 什么是序 ...

  5. python shelve模块_python常用模块之shelve模块

    python常用模块之shelve模块 shelve模块是一个简单的k,v将内存中的数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据类型 我们在上面讲json.pickle ...

  6. python shelve模块_python3 shelve模块的详解

    python3 shelve模块的详解 一.简介 在python3中我们使用json或者pickle持久化数据,能dump多次,但只能load一次,因为先前的数据已经被后面dump的数据覆盖掉了.如果 ...

  7. python shelve模块_说说 Python 的 shelve 模块

    利用 Python 的 shelve 模块, 可以将程序中需要保存的数据,以二进制放入 shelf 文件中.另一个程序就可以读取 shelf 文件,用于业务逻辑.也就是说 shelve 模块可以实现数 ...

  8. python 学习第四十七天shelve模块

    shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式. 1,序列化 import shelve f=shelve.open('she ...

  9. 初学者python笔记(json模块、pickle模块、xml模块、shelve模块)

    文章目录 json模块 正常数据转化(复杂) json模块的相关操作 pickle模块 shelve模块 xml模块 在Python中,json模块.pickle模块.xml模块.shelve模块这四 ...

  10. shelve模块简单用法

    shelve模块可用来存储字典文件,用法与字典类似 写数据: 1 import shelve 2 import datetime 3 4 d=shelve.open('shelve_test') 5 ...

最新文章

  1. vue右键自定义菜单_一款小巧的开源右键菜单管理软件
  2. OpenResty 通过二级域名做跳转
  3. java时钟面板clock
  4. 2-3 人工智能需要的基本数学知识|人工智能框架TensorFlow应用实践
  5. vs2008中combox用法总结
  6. 亦云小组KTV点歌系统简介
  7. Linux下获取文件编译的时间
  8. 索尼Xperia 5前置拍照斩获DxOMark得79分
  9. [译] LINUX内核内存屏障
  10. Mongodb 3.0 创建用户
  11. IEEE 你吃透了吗?
  12. sxos中文官网_Canva中文官网下载-Canva中文版下载安装v2.83.0
  13. Excel作图-子母饼图绘制
  14. java中int不兼容_mvn install命令时,一直报错:不兼容的类型 [ERROR] 找到: java.lang.Object [ERROR] 需要: int...
  15. 台式计算机音频插口,解决台式机电脑机箱前置音频插口(接口)不能使用一例.
  16. 这个世界上,没有什么是实实在在的, 都是空虚,虚无, 空虚的空,虚无的虚,无的无....
  17. 服务器无限刷石机推荐,【红石技巧】-世界上最快的刷石机
  18. Learning to rank 小结
  19. java 基础 练习 幸运小游戏
  20. 学生的致谢笑死!导师:致谢别矫情,没屁在那硬编!

热门文章

  1. Advanced Bash-Scripting Guide 学习笔记一
  2. Linux指令not found
  3. 机器学习实战(十一)利用PCA来简化数据
  4. 2020-07-28
  5. 为什么很多大老板银行贷款几千万,看起来还那么潇洒?
  6. 贷款能否成功,这4个人说了算
  7. 真实,让文学回到原点:关于非虚构写作的思考
  8. python语言的编程模式_一种基于Python语言的EDA开发平台及其使用方法与流程
  9. resnet keras 结构_Day146:第二讲 ResNet
  10. linux中自动挂载脚本,LIUNX一键自动挂载脚本,宝塔磁盘LIUNX一键分区磁盘 | 帮助信息-动天数据...