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编程中三条常用的技巧
May 11 Python
python获取mp3文件信息的方法
Jun 15 Python
使用Python读写文本文件及编写简单的文本编辑器
Mar 11 Python
python基础学习之如何对元组各个元素进行命名详解
Jul 12 Python
关于Pycharm无法debug问题的总结
Jan 19 Python
Form表单及django的form表单的补充
Jul 25 Python
python 类的继承 实例方法.静态方法.类方法的代码解析
Aug 23 Python
python定位xpath 节点位置的方法
Aug 27 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
Jan 04 Python
python3实现飞机大战
Nov 29 Python
python多线程和多进程关系详解
Dec 14 Python
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 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
PHP安装攻略:常见问题解答(一)
2006/10/09 PHP
php读取excel文件示例分享(更新修改excel)
2014/02/27 PHP
教你如何用php实现LOL数据远程获取
2014/06/10 PHP
php中动态修改ini配置
2014/10/14 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
2016/04/27 PHP
Joomla调用系统自带编辑器的实现方法
2016/05/05 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
在html页面中包含共享页面的方法
2008/10/24 Javascript
MooTools 1.2介绍
2009/09/14 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
关于JavaScript的变量的数据类型的判断方法
2015/08/14 Javascript
基于jQuery的Web上传插件Uploadify使用示例
2016/05/19 Javascript
jQuery简单入门示例之用户校验demo示例
2016/07/09 Javascript
javascript获取网页各种高宽及位置的方法总结
2016/07/27 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
2016/08/05 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
2017/04/13 Javascript
[06:53]2018DOTA2国际邀请赛寻真——勇于创新的Vici Gaming
2018/08/14 DOTA
Python中下划线的使用方法
2015/03/27 Python
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
Python正则表达式匹配中文用法示例
2017/01/17 Python
一道python走迷宫算法题
2018/01/22 Python
Python2与Python3的区别实例总结
2019/04/17 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
Allen Edmonds官方网站:一家美国优质男士鞋类及配饰制造商
2019/03/12 全球购物
英国莱斯特松木橡木家具网上商店:Choice Furniture Superstore
2019/07/05 全球购物
写好自荐信的几个要点
2013/12/26 职场文书
最新奶茶店创业计划书
2014/01/25 职场文书
生态养殖创业计划书
2014/05/06 职场文书
教研处工作方案
2014/05/26 职场文书
大学感恩节活动总结
2015/05/05 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
生产车间管理制度
2015/08/04 职场文书
Python中异常处理用法
2021/11/27 Python