shelve模块是一个简单的k,v将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式,他只有一个函数就是open(),这个函数接收一个参数就是文件名,然后返回一个shelf对象,你可以用他来存储东西,就可以简单的把他当作一个字典,当你存储完毕的时候,就调用close函数来关闭。

>>> import shelve

>>> sfile = shelve.open('shelve_test')    # 打开一个文件

>>> sfile['k1'] = ['a','b']               # 持久化存储列表

>>> sfile['k1']

['a','b']

>>> sfile.close()                  # 文件关闭

pickle 存储或读取方式如下:

将字符串转换成只有python能认识的字符串存储在文件中

>>> import pickle

>>> pw = open('test','wb')

>>> pw.write(pickle.dumps(['a','b']))

>>> pw.close()

通过pickle.load 将字符串转成原数据形式

>>> pr = open('test','rb')

>>> prf = pickle.load(pr)

>>> prf

['a', 'b']

但是现在我想持久化存储的列表进行操作,例如添加、删除、数据等,那么shelve 与 pickle是否都能这么操作呢?

>>> import shelve

>>> sfile = shelve.open('shelve_test')

>>> sfile['k1'] = ['a','b']

>>> sfile['k1'].append('c')

>>> sfile['k1']

['a', 'b']

存储的c到哪里去了呢?其实很简单,c没有写回,你把['a', 'b']存到了k1,当你再次读取sfile['k1']的时候,sfile['k1']只是一个拷贝,而你没有将拷贝写回,所以当你再次读取s['x']的时候,它又从源中读取了一个拷贝,

所以,你新修改的内容并不会出现在拷贝中,解决的办法就是,第一个是利用一个缓存的变量,但这只能适用一个

对象,面对多个对象就束手无策了:

>>> tmp = sfile['k1']

>>> tmp.append('c')

>>> sfile['k1'] = tmp

>>> sfile['k1']

['a', 'b', 'c']

>>> sfile['k2'] = ['1','2']

>>> sfile['k2'].append('3')

>>> sfile['k2']

['1', '2']

那么怎么才能从根本上达到我想要的效果呢?咦!有一个办法,刚才提到c没有写回,如果让所有更

改数据都写回不就能达到效果了吗,那就是writeback,将writeback置为True,见效果:

>>> sfile = shelve.open('shelve_test')

>>> sfile.writeback = True

>>> sfile['k1']

['a', 'b', 'c']

>>> sfile['k1'].append('d')

>>> sfile['k1']

['a', 'b', 'c', 'd']

>>> sfile['k2'] = ['1','2']

>>> sfile['k2']

['1', '2']

>>> sfile['k2'].append('3')

>>> sfile['k2']

['1', '2', '3']

另外,shelve 之VS. pickle 当然pickle也有同样的功能,在成为pickle的对象后即为列表对象,由此可对list

进行一系列的操作

>>> pw = open('test1','wb')

>>> pw.write(pickle.dumps(['a','b']))

>>> pw.close()

>>> pr = open("test1","rb")

>>> prf = pickle.load(pr)

>>> print(prf)

['a', 'b']

>>> print(prf.append('c'))

None

>>> print(prf)

['a', 'b', 'c']

>>>

转载于:https://blog.51cto.com/51enjoy/1743984

shelve 之VS. pickle相关推荐

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

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

  2. python模块--json \ pickle \ shelve \ XML模块

    一.json模块 之前学习过的eval内置方法可以将一个字符串转成一个python对象,不过eval方法时有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,e ...

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

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

  4. Python(序列化json,pickle,shelve)

    序列化 参考:https://www.cnblogs.com/yuanchenqi/articles/5732581.html 1 # dic = str({'1':'111'}) 2 # 3 # f ...

  5. python三十六:shelve模块

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

  6. python中shelf对象_11.4. shelve — Python 对象持久化 — Python 2.7.18 文档

    11.4.shelve - Python 对象持久化¶ "shelf" 是一种持久化的类似字典的对象. 与 "dbm" 数据库的区别在于 shelf 中的值(不 ...

  7. Python之shelve模块详解

    一.定义 Shelve是对象持久化保存方法,将对象保存到文件里面,缺省(即默认)的数据存储文件是二进制的. 二.用途 可以作为一个简单的数据存储方案. 三.用法 使用时,只需要使用open函数获取一个 ...

  8. python模块之shelve

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

  9. python常用模块: xml和shelve模块教程

    1.xml模块 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单, 不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金 ...

最新文章

  1. 去水印--《On the Effectiveness of Visible Watermarks》
  2. springboot项目打包成war并在tomcat上运行的步骤
  3. 【机器视觉】 dev_set_contour_style算子
  4. Nginx内存管理详解
  5. Windows Server 2008域中组的简析
  6. android用usb无法连接ubuntu13.10(vmware中安装ubuntu) lsusb找不到手机
  7. java系统参数表有哪些_Java 设置系统参数和运行参数
  8. matlab绘制奈奎斯特图
  9. 辐射定标、辐射校正、大气校正、正射校正概念
  10. matlab示例程序,matlab示例程序
  11. 如何破解无线网络密码(无线网络密码破解)
  12. 华三交换机如何进入配置_如何初始化配置H3C交换机
  13. C#调用WPS2016方法和常见问题处理
  14. 基于Struts+Hibernate开发公文流转系统
  15. 字大小数据 - 快速取模的C++实现
  16. 什么是latch以及如何导致latch争用
  17. 在AWS Lambda上部署EC2编译的FFmpeg工具——自定义层的方案
  18. TRITTON天猫旗舰店开业 2月20日7折大促
  19. 连连支付提现人民币的时候汇率是怎么样的?
  20. Stochastic Depth ResNet

热门文章

  1. Flutter开发之路由跳转与传参(七)
  2. The CLR’s Execution Model(Chapter 1 of CLR via C#)
  3. 微服务网关从零搭建——(三)Ocelot网关 + identity4
  4. 【数据结构】排序算法总结
  5. mac 下搭建 php + apache + mysql 服务器(cool)
  6. 设置sql*plus的sqlprompt
  7. 是知当代之士、驰骛之曹,书读纵横,则思诸侯之变
  8. 函数式编程之-拒绝空引用异常(Option类型)
  9. 解决vue初始化数据时的闪烁问题
  10. 让pip使用国内镜像,解决下载速度慢的问题