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解析excel文件存入sqlite数据库的方法
Nov 15 Python
Collatz 序列、逗号代码、字符图网格实例
Jun 22 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
May 15 Python
实例详解Python装饰器与闭包
Jul 29 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
Aug 22 Python
用Python画一个LinkinPark的logo代码实例
Sep 10 Python
Python使用uuid库生成唯一标识ID
Feb 12 Python
Python接口测试get请求过程详解
Feb 28 Python
在python tkinter界面中添加按钮的实例
Mar 04 Python
Python filter()及reduce()函数使用方法解析
Sep 05 Python
Python调用系统命令os.system()和os.popen()的实现
Dec 31 Python
超级详细实用的pycharm常用快捷键
May 12 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
Linux系统中为php添加pcntl扩展
2016/08/28 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
PHP调用接口用post方法传送json数据的实例
2018/05/31 PHP
Firefox 无法获取cssRules 的解决办法
2006/10/11 Javascript
js 模拟气泡屏保效果代码
2010/07/10 Javascript
javascript学习笔记(五) Array 数组类型介绍
2012/06/19 Javascript
javascript实现2048游戏示例
2014/05/04 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
2016/06/16 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
2016/11/22 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
2017/12/01 Javascript
javascript数组拍平方法总结
2018/01/20 Javascript
基于vue-resource jsonp跨域问题的解决方法
2018/02/03 Javascript
vue将时间戳转换成自定义时间格式的方法
2018/03/02 Javascript
一步快速解决微信小程序中textarea层级太高遮挡其他组件
2019/03/04 Javascript
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
VueCli生产环境打包部署跨域失败的解决
2020/11/13 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
vue-router懒加载的3种方式汇总
2021/02/28 Vue.js
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
Python中偏函数用法示例
2018/06/07 Python
Selenium控制浏览器常见操作示例
2018/08/13 Python
Windows下Python3.6安装第三方模块的方法
2018/11/22 Python
对python For 循环的三种遍历方式解析
2019/02/01 Python
Python玩转Excel的读写改实例
2019/02/22 Python
django-rest-swagger对API接口注释的方法
2019/08/29 Python
tensorflow2.0的函数签名与图结构(推荐)
2020/04/28 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
意大利领先的奢侈品在线时装零售商:MCLABELS
2020/10/13 全球购物
explicit和implicit的含义
2012/11/15 面试题
公司保密管理制度
2015/08/04 职场文书
pandas中对文本类型数据的处理小结
2021/11/01 Python