day5-shelve模块

一、概述

前面章节我们讲述了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
    代码执行后会生成三个文件:
    image
    其中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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员:请你不要对业务「置之不理」

成长是条孤独的路,一个人会走得更快;有志同道合者同行,会走得更远。本篇内容整理自 21 天鲲鹏新青年计划线上分享内容。鲲鹏新青年计划是由 TGO 鲲鹏会组织的线上分享活动,希望能帮助更多同学一起学习、成长。12 月 28 日&#xf…

在Ubuntu系统下如何将chrome浏览器的bookmarks导出到本地

1. 打开chrome浏览器在页面的右上角点击那个三个小点的位置,找到bookmarks,然后点击bookmarks manager,然后在organize右侧大倒三角下选择,export bookmarks to HTML,选择要保存的位置,利用同样的方法下次就可以直接导…

028 -bash-4.1$ 出现故障的原理及解决办法?

最近在搭建分布式的时候,出现了这个问题,很不爽。下面是我的解决方式。 1.在用户下删除bash rm -rf /home/beifeng/.bash* 2.拷贝 cp /etc/skel/.bash* /home/beifeng 3.退出,再进入用户 4.解释 set |grep -i ps1 转载于:https://www.cnblogs…

李彦宏千字愿景内部信:10次提到“用户”

中新网1月17日电 1月17日,百度公司创始人、董事长兼CEO李彦宏发出一封内部信,信中,李彦宏向员工阐述了百度愿景:成为最懂用户,并能帮助人们成长的全球顶级高科技公司。他提出,百度要持续创新,“…

spring-boot 速成(8) 集成druid+mybatis

spring-boot与druid、mybatis集成(包括pageHelper分页插件), 要添加以下几个依赖项: compile(mysql:mysql-connector-java:6.0.5)compile(tk.mybatis:mapper-spring-boot-starter:1.1.1)compile(org.mybatis.spring.boot:mybatis-spring-boot-starter:1.…

我们怎样确保从大数据计算中获得价值

我们怎样确保从大数据计算中获得价值 支持大数据方案并不是在硬件以及软件层次终止,企业要想真正地从大数据中受益,领导者必须改变思考与对待信息的方式。 我们怎样确保从大数据计算中获得价值? 当所有可用数据都可用时,大数据…

青海省多地日降水量突破历史极值

受高原槽和西北冷空气的共同影响,青海省海西州茫崖等多地日降水量突破历史极值。 李万花 摄 受高原槽和西北冷空气的共同影响,青海省海西州茫崖等多地日降水量突破历史极值。 李万花 摄 中新网西宁1月18日电 (孙睿 赵海梅)记者18日从青海省气象局获悉&am…

ORB-SLAM2中四叉树管理特征点

当从图像金字塔中的每一层图像上提取特征点之后,都要先用四叉树技术对这些特征点进行管理 //该类中定义了四叉树创建的函数以及树中结点的属性 //bool bNoMore: 根据该结点中被分配的特征点的数目来决定是否继续对其进行分割 //DivisionNode()&#xff…

SharePoint Search之(七)Search result- 结果源

在使用搜索引擎的时候。非常多情况下,用户希望限定一下搜索范围,以便更加easy找到想要的结果。在SharePoint 2013的search里,也支持类似的功能,SharePoint 默认提供了几种范围: 在SharePoint,这个叫Search …

旷视砸20亿进军AIoT,发布国内首个机器人协作大脑河图

1 月 16 日,人工智能独角兽旷视科技发布了机器人战略,以及自 2018 年 4 月收购艾瑞思机器人,进军机器人领域的最新进展——智能协同大脑河图。在会上,旷视还大笔一挥,决定投入 20 亿元,用于打造物流仓储上下…

「JupyterLab」 Jupyter Notebook 新生代IDE模式页面

参考:Overview 安装: $ pip install jupyterlab 启动(不是jupyter notebook): $ jupyter lab Jupyterlab中最好用的就是显示csv数据。CSV数据显示效果: 安装插件 jupyterlab是和jupyter notebook隔离的&…

PAT(乙级)1009

1009. 说反话 (20)给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。 输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母&…

库存扣减问题

2019独角兽企业重金招聘Python工程师标准>>> 并发减库存 并发扣库存问题总结 库存扣减还有这么多方案? | 架构师之路 转载于:https://my.oschina.net/u/2939155/blog/3004363

HSRPSTPACL

1 HSRP配置 1.1 问题 在企业网络到外部的连接方案中,要求不高的条件下可以是单出口。一旦该出口线路出现问题,整个企业网络就不能连接到外网了。为了使得企业网络到外网连接的高可用性,可以设置两个以上的出口,然而多个出口对…

java 的 CopyOnWriteArrayList类

初识CopyOnWriteArrayList 第一次见到CopyOnWriteArrayList,是在研究JDBC的时候,每一个数据库的Driver都是维护在一个CopyOnWriteArrayList中的,为了证明这一点,贴两段代码,第一段在com.mysql.jdbc.Driver下&#xff0…

科技的趋势!AI将进军了37%的企业

2019独角兽企业重金招聘Python工程师标准>>> 市场研究机构Gartner调查了全球89个国家的逾3,000名信息长(CIO),显示有37%的企业已经或打算于近期内部署人工智能(AI),在4年内成长270%。Gartner研究…

CMakeLists.txt编写规则

在PROJECT_SOURCE_DIR下新建了src, include, lib, bin四个子文件夹。 src文件夹用来存放所有的.cpp文件,include文件夹用来存储所有的.h文件, lib中存放生成的自己编写的共享库, bin中存放所有的可执行文件 用SET来设置.exe可执行文件和共享…

瓜子二手车发12月二手车价格:汉兰达奥德赛CR-V保值率居首

中新网1月22日电 日前,基于海量个人对个人的二手车成交数据,瓜子二手车公布了12月全国及多个核心城市的二手车交易“瓜子价”数据。数据显示,2018年12月全国瓜子二手车严选直卖签约均价为87934元,环比上涨0.16%,同比上…

概率分布之间的距离度量以及python实现(三)

概率分布之间的距离,顾名思义,度量两组样本分布之间的距离 。 1、卡方检验 统计学上的χ2统计量,由于它最初是由英国统计学家Karl Pearson在1900年首次提出的,因此也称之为Pearson χ2,其计算公式为 (i1,2&…