python的pickle和shelve模块
python中用于序列化的模块总结
目录
pickle模块
shelve模块
xml模块
pickle模块
介绍
Pickle的问题和所有其他编程语言特有的序列化问题一样,就是它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,不能成功地反序列化也没关系,所以只用在数据存储上,但是json能做数据传输和存储。
优点就是支持的数据类型多,能序列化函数、类。
使用
json会把数据转为字符串
pickle会把数据转为字节类型的数据 四个方法
pickle.dumps()
pickle.dump()
pickle.load()
pickle.load()
四个方法的使用方法和json模块一样
具体可以结合json模块一起学习
https://www.cnblogs.com/-wenli/p/10187130.html
#存储数据
import pickle
dic={'name':'linlin','age':18}
data1 = pickle.dumps(dic) #序列化
f = open('file1','wb') #存储
f.write(data1)
f.close()
运行结果:
可以看到存储到文件的数据,我们是看不懂的,不同于json

#读取数据 import pickle
f = open('file1','rb') data2=f.read()
data2=pickle.loads(data2)#反序列化
print(data2)
key_value=data2['name']
print(key_value)
f.close()
运行结果:

shelve模块
shelve类似于一个存储持久化对象的持久化字典,即字典文件。 使用方法也类似于字典。 shelve模块可以当成一个轻量的数据库db,将数据以字典的类型(key,value)通过文件持久化,模拟出简单的db效果。
存储数据
注意:shelve模块有个限制,它不支持多个应用同一时间往同一个DB(文件)进行写操作。
import shelve
db1 = shelve.open('file') #打开一个文件
db1['dic'] = {'int':12, 'float':2.5, 'string':'shelve db'}
#这里dic为key,key必须为字符串,而值可以是python所支持的数据类型
#直接对文件句柄[key]操作,就可以存入数据
db1.close()
且重要的是它还会直接在打开的当前目录生成三个文件:
file.bak
file.dat
file.dir
其中shelve.db1.dat 存储的就是b字节数据类型的数据, bak和dir后缀的就可能是和数据库相关的设计缓存之类的东西。
读取数据
注意:取出数据的时候也只需要直接用字典的操作方法获取即可,但是如果key不存在会报错
import shelve
f = shelve.open('file') #打开一个文件 #第一种方式
print(f.get('dic')['int']) #12
print(f.get('dic')['float']) #2.5
print(f.get('dic')['string']) #shelve db
#第二种方式
print(f['dic']['int'])#12
print(f['dic']['float']) #2.5 print(f['dic']['string']) #shelve db
修改数据
由于shelve在默认情况下是不会记录对持久化对象(字典下的键的值-条目)做出修改的,
所以在shelve.open()时候需要修改默认参数writeback=True,
否则对象的条目修改不会'拷贝回写'来进行保存。 当试图让shelve去自动捕获对象的变化时,应当在打开shelf的时候将writeback设置为True。
而将writeback这个flag设置为True以后,shelf将会将所有从DB中读取的对象存放到一个内存缓存。
当close() shelf的时候,缓存中所有的对象会被重新写入DB。
#第一种方法
#修改键值
import shelve
f = shelve.open('file',writeback=True) #打开一个文件 data=f['dic']['int']
data = 10
f.close() #这里一定要关闭文件,才能读取到修改后的值
print(data) #10 #添加列表值
import shelve
list1 = ['tie', 'le', 'yu']
# 既然最终生成的文件会是dat格式的,何不一开始就指定后缀是dat
db2 = shelve.open('shelve_db2.dat')
db2['lis'] = list1
# 文件句柄是通过字典的操作方式去拿里面的键值对,lis这个键对应的值是一个列表
db2['lis'].append('mao')
# 而此列表增加一个字符串元素后再打印,感觉不出有发生增加的变化
print(type(db2['lis']), db2['lis'])
# 返回列表:['tie', 'le', 'yu']
#这里返回的结果没有'mao',因为没有写回。
#第二种方法
import shelve
f = shelve.open('file') #打开一个文件
temp=f['dic'] #从文件中读取之前存储的对象
temp['int']=12 #直接对对象进行修改
f['dic']=temp #重新存储至字典文件对象中
print(f['dic']) #{'int': 12, 'float': 2.5, 'string': 'shelve db'}
总结
第一种方法shelve会将所有从DB中读取的对象存放到一个内存缓存,当close() shelf的时候,缓存中所有的对象会被重新写入DB,所以一定要关闭文件,重新读取才能生效
writeback方式有优点也有缺点 优点是减少了我们出错的概率,且让对象的持久化对用户更加的透明了
但这种方式并不是所有的情况下都需要
首先,使用writeback以后,shelf在open()的时候会增加额外的内存消耗
并且当DB在close()的时候会将缓存中的每一个对象都写入到DB,这也会带来额外的等待时间
因为shelve没有办法知道缓存中哪些对象修改了,哪些对象没有修改,因此所有的对象都会被写入
第二种方法通过中间变量实现了修改,这种属于直接赋值和拷贝写回无关,会生效,新值覆盖旧值
所以我们一定要弄明白一件事情
从shelve的db文件中重新再访问一个key拿的是它的拷贝
修改此拷贝后不做拷贝写回并不影响原来的key
但你要是直接做的操作是赋值新的值到一个key里,那肯定就是指向原来的key,会被覆盖的
而这种赋值覆盖对于shelve来说这是一个正常的行为阿
和键中的值看起来不能被修改一事并不矛盾
python的pickle和shelve模块的更多相关文章
- python pickle 和 shelve模块
pickle和shelve模块都可以把python对象存储到文件中,下面来看看它们的用法吧 1.pickle 写: 以写方式打开一个文件描述符,调用pickle.dump把对象写进去 dn = {'b ...
- python基础--json,pickle和shelve模块
一.JSON &pickle 用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 字符串必须是双引号,不能是单引号 pickle,用于python特有的类型 和 ...
- python json、 pickle 、shelve 模块
json 模块 用于序列化的模块 json,用于字符串 和 python数据类型间进行转换 Json模块提供了四个功能:dumps.dump.loads.load #!/usr/bin/env pyt ...
- 小白的Python之路 day5 shelve模块讲解
shelve模块讲解 一.概述 之前我们说不管是json也好,还是pickle也好,在python3中只能dump一次和load一次,有什么方法可以向dump多少次就dump多少次,并且load不会出 ...
- os常用模块,json,pickle,shelve模块,正则表达式(实现运算符分离),logging模块,配置模块,路径叠加,哈希算法
一.os常用模块 显示当前工作目录 print(os.getcwd()) 返回上一层目录 os.chdir("..") 创建文件包 os.makedirs('python2/bin ...
- (十四)json、pickle与shelve模块
任何语言,都有自己的数据类型,那么不同的语言怎么找到一个通用的标准? 比如,后端用Python写的,前端是js,那么后端如果传一个dic字典给前端,前端肯定不认. 所以就有了序列化这个概念. 什么是序 ...
- Python序列化-pickle和json模块
Python的“file-like object“就是一种鸭子类型.对真正的文件对象,它有一个read()方法,返回其内容.但是,许多对象,只要有read()方法,都被视为“file-like obj ...
- Python标准库之shelve模块(序列化与反序列化)
shelve模块是一个简单的key,value将内存数据通过文件持久化的模块,可以持久化任何picklel可支持的Python数据格式. 序列化 序列化源代码: import shelve impor ...
- 第九节:os、sys、json、pickle、shelve模块
OS模块: os.getcwd()获取当前路径os.chdir()改变目录os.curdir返回当前目录os.pardir()父目录os.makedirs('a/b/c')创建多层目录os.remov ...
随机推荐
- IOS中的用户安全
用户安全: 原则:在网络传输过程中,关于用户的密码是不能传递明文的,需要通过加密之后进行传递, 一般采用的加密技术是: (1)md5+盐 (2)hmac+md5 (3)hmac+md5+时间戳 这 ...
- SSH开发环境搭建
断断续续学习hibernate也有一段时间了,在这里研究一下SSH开发环境的搭建过程,自己简单的搭建一个SSH的开发环境.采用maven搭建. 0.项目结构: 1.导包:(maven项目) pom.x ...
- kdevelop 添加对 C++11的支持
工程--打开配置--显示高级--显示高级变量(打钩) CMAKE_CXX_FLAGS 项添加 -std=c++0x
- Netty通信原理
Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端,它极大的简化了TCP和UDP套接字服务器等网络编程. BIO(Blocking IO):每一个请求,一个S ...
- SSD win7优化步骤
随着固态硬盘价格不断下降,目前固态硬盘也得到了广泛了应用,一些新笔记本以及组装电脑也开始普遍采用固态硬盘平台,超级本就更不用说了,采用固态硬盘已经成标配化,虽然固态硬盘速度很快,但不懂的优化,依然无法 ...
- 关于python中的类方法(classmethod)和静态方法(staticmethod)
首先明确两点: a)python在创建类的时候,self指向的是类的实例而不是类属性! b)我们所创建的类的方法有两种作用,一种是改变类的属性,一种是改变实例的属性,这点一定要分清! c)我们在调用类 ...
- camera驱动框架分析(上)【转】
转自:https://www.cnblogs.com/rongpmcu/p/7662738.html 前言 camera驱动框架涉及到的知识点比较多,特别是camera本身的接口就有很多,有些是直接连 ...
- 字符串cookies转字典 scrapy使用。
配置文件 DOWNLOADER_MIDDLEWARES = { 'weibo.middlewares.CookiesMiddleware': 543, } 中间件内容 class CookiesMid ...
- 006_nginx动态upstream和安全检查模块
一.参考Tengine http://tengine.taobao.org/document_cn/http_dyups_cn.html ngx_http_dyups_module Descrip ...
- 解决Javascript中$(window).resize()多次执行
有些时候,我们需要在浏览器窗口发生变化的时候,动态的执行一些操作,比如做自适应页面时的适配.这个时候,我们需要在窗口拖动的时候去执行代码.但是有些时候,执行的操作比较复杂,我们只希望在窗口拖动完毕之后 ...