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 django 增删改查操作 数据库Mysql
Jul 27 Python
Python 模拟购物车的实例讲解
Sep 11 Python
Python简单实现socket信息发送与监听功能示例
Jan 03 Python
Python面向对象之类和对象实例详解
Dec 10 Python
Python解决线性代数问题之矩阵的初等变换方法
Dec 12 Python
在Python中如何传递任意数量的实参的示例代码
Mar 21 Python
详解python之heapq模块及排序操作
Apr 04 Python
使用GitHub和Python实现持续部署的方法
May 09 Python
python 实现二维列表转置
Dec 02 Python
Python阶乘求和的代码详解
Feb 14 Python
python中scrapy处理项目数据的实例分析
Nov 22 Python
用Python爬取英雄联盟的皮肤详细示例
Dec 06 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
将OICQ数据转成MYSQL数据
2006/10/09 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
thinkPHP5框架分页样式类完整示例
2018/09/01 PHP
javascript 写类方式之二
2009/07/05 Javascript
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
2012/01/13 Javascript
全面理解面向对象的 JavaScript(来自ibm)
2013/11/10 Javascript
JavaScript中跨域调用Flash的方法
2014/08/11 Javascript
JavaScript实现的encode64加密算法实例分析
2015/04/15 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
AngularJS基础知识笔记之表格
2015/05/10 Javascript
js匿名函数作为函数参数详解
2016/06/01 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
2016/11/03 Javascript
用iframe实现不刷新整个页面上传图片的实例
2016/11/18 Javascript
微信小程序 使用canvas制作K线实例详解
2017/01/12 Javascript
原生js实现弹出层效果
2017/01/20 Javascript
Vue.js框架路由使用方法实例详解
2017/08/25 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
vue通过cookie获取用户登录信息的思路详解
2018/10/30 Javascript
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
2019/06/15 Javascript
详细教你微信公众号正文页SVG交互开发技巧
2019/07/25 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
JavaScript 类的封装操作示例详解
2020/05/16 Javascript
python数据处理实战(必看篇)
2017/06/11 Python
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
Python Pywavelet 小波阈值实例
2019/01/09 Python
解决Django加载静态资源失败的问题
2019/07/28 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
基于Keras中Conv1D和Conv2D的区别说明
2020/06/19 Python
几款Python编译器比较与推荐(小结)
2020/10/15 Python
纯DOM+CSS3实现简单的小风车动画
2016/09/27 HTML / CSS
出纳的岗位职责
2013/11/09 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
学校施工安全责任书
2015/01/29 职场文书
军训后的感想
2015/08/07 职场文书