Python 序列化 pickle/cPickle模块使用介绍


Posted in Python onNovember 30, 2014

Python序列化的概念很简单。内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人。你会怎么做?这取决于你想要怎么保存,怎么重用,发送给谁。很多游戏允许你在退出的时候保存进度,然后你再次启动的时候回到上次退出的地方。(实际上,很多非游戏程序也会这么干)在这种情况下,一个捕获了当前进度的数据结构需要在你退出的时候保存到硬盘上,接着在你重新启动的时候从硬盘上加载进来。

Python标准库提供pickle和cPickle模块。cPickle是用C编码的,在运行效率上比pickle要高,但是cPickle模块中定义的类型不能被继承(其实大多数时候,我们不需要从这些类型中继承,推荐使用cPickle)。cPickle和pickle的序列化/反序列化规则是一样的,使用pickle序列化一个对象,可以使用cPickle来反序列化。同时,这两个模块在处理自引用类型时会变得更加“聪明”,它不会无限制的递归序列化自引用对象,对于同一对象的多次引用,它只会序列化一次。

pickle模块中的两个主要函数是dump()和load()。dump()函数接受一个数据对象和一个文件句柄作为参数,把数据对象以特定的格式保存到给定的文件中。当我们使用load()函数从文件中取出已保存的对象时,pickle知道如何恢复这些对象到它们本来的格式。

dumps()函数执行和dump()函数相同的序列化。取代接受流对象并将序列化后的数据保存到磁盘文件,这个函数简单的返回序列化的数据。
loads()函数执行和load()函数一样的反序列化。取代接受一个流对象并去文件读取序列化后的数据,它接受包含序列化后的数据的str对象, 直接返回的对象。

cPickle.dump(obj, file, protocol=0)
序列化对象,并将结果数据流写入到文件对象中。参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。protocol的值还可以是1或2,表示以二进制的形式序列化。

cPickle.load(file)
反序列化对象。将文件中的数据解析为一个Python对象。

下面通过一个简单的例子来演示上面两个方法的使用:

>>> import pickle,cPickle
>>> info_dict = {'name':'yeho','age':100,'Lang':'Python'}
>>> f = open('info.pkl','wb')
>>> pickle.dump(info_dict,f)
>>> f.close()
>>> exit()
# cat info.pkl
(dp0
S'Lang'
p1
S'Python'
p2
sS'age'
p3
I100
sS'name'
p4
S'yeho'
p5
s.
>>> import cPickle
>>> info_dict
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
NameError: name 'info_dict' is not defined
>>> f = open('info.pkl','r+')
>>> info2_dict = cPickle.load(f)
>>> info2_dict
{'Lang': 'Python', 'age': 100, 'name': 'yeho'}
>>> info2_dict['age'] = 110
>>> cPickle.dump(info2_dict,f)
>>> f.close()
>>> exit()
>>> import pickle
>>> f = open('info.pkl','r+')
>>> info_dict = pickle.load(f)
>>> info_dict
{'Lang': 'Python', 'age': 100, 'name': 'yeho'}
>>> info2_dict = pickle.load(f)
>>> info2_dict
{'Lang': 'Python', 'age': 110, 'name': 'yeho'}
>>> info3_dict = pickle.load(f)
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/lib64/python2.6/pickle.py", line 1370, in load
 return Unpickler(file).load()
 File "/usr/lib64/python2.6/pickle.py", line 858, in load
 dispatch[key](self)
 File "/usr/lib64/python2.6/pickle.py", line 880, in load_eof
 raise EOFError
EOFError
Python 相关文章推荐
python切换hosts文件代码示例
Dec 31 Python
pycharm 使用心得(六)进行简单的数据库管理
Jun 06 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
Jan 20 Python
Python处理时间日期坐标轴过程详解
Jun 25 Python
Django文件存储 默认存储系统解析
Aug 02 Python
详解python 降级到3.6终极解决方案
Feb 06 Python
python实现逆滤波与维纳滤波示例
Feb 26 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
Mar 19 Python
jupyter notebook 使用过程中python莫名崩溃的原因及解决方式
Apr 10 Python
Python如何输出整数
Jun 07 Python
为什么python比较流行
Jun 19 Python
python 窃取摄像头照片的实现示例
Jan 08 Python
Linux下Python获取IP地址的代码
Nov 30 #Python
Python re模块介绍
Nov 30 #Python
Python os模块介绍
Nov 30 #Python
Python实现的检测网站挂马程序
Nov 30 #Python
Python实现网站文件的全备份和差异备份
Nov 30 #Python
Python3 能振兴 Python的原因分析
Nov 28 #Python
Python3 正在毁灭 Python的原因分析
Nov 28 #Python
You might like
DOTA2【瓜皮时刻】Vol.91 RTZ山史最惨“矿难”
2021/03/05 DOTA
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
PHP实现微信小程序人脸识别刷脸登录功能
2018/05/24 PHP
Ext javascript建立超链接,进行事件处理的实现方法
2009/03/22 Javascript
jQuery 判断页面元素是否存在的代码
2009/08/14 Javascript
jquery下组织javascript代码(js函数化)
2010/08/25 Javascript
js字符串的各种格式的转换 ToString,Format
2011/08/08 Javascript
JS时间选择器 兼容IE6,7,8,9
2012/06/26 Javascript
关于div自适应高度/左右高度自适应一致的js代码
2013/03/22 Javascript
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
javascript输出AscII码扩展集中的字符方法
2016/12/26 Javascript
Node.js 中使用 async 函数的方法
2017/11/20 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
Moment.js实现多个同时倒计时
2019/08/26 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
Tornado服务器中绑定域名、虚拟主机的方法
2014/08/22 Python
python3 破解 geetest(极验)的滑块验证码功能
2018/02/24 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
2019/05/27 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
今天学到的CSS最新技术(与图片背景相关)
2012/12/24 HTML / CSS
html5的自定义data-*属性与jquery的data()方法的使用
2014/07/02 HTML / CSS
《美丽的黄昏》教学反思
2014/02/28 职场文书
汽车维修求职信
2014/06/15 职场文书
关爱老人标语
2014/06/21 职场文书
维稳承诺书
2015/01/20 职场文书
本科毕业论文致谢怎么写
2015/05/14 职场文书
2015年电信员工工作总结
2015/05/26 职场文书
医疗纠纷调解协议书
2015/08/06 职场文书
晶体管单管来复再生式收音机
2021/04/22 无线电