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内置的字符串处理函数整理
Jan 29 Python
python获得图片base64编码示例
Jan 16 Python
Python 实现一个颜色色值转换的小工具
Dec 06 Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 Python
Python对象转换为json的方法步骤
Apr 25 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
Aug 06 Python
python-序列解包(对可迭代元素的快速取值方法)
Aug 24 Python
python Django框架实现web端分页呈现数据
Oct 31 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
Apr 30 Python
python读取excel数据绘制简单曲线图的完整步骤记录
Oct 30 Python
pycharm 使用anaconda为默认环境的操作
Feb 05 Python
python 使用tkinter与messagebox写界面和弹窗
Mar 20 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中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
php+MySQL判断update语句是否执行成功的方法
2014/08/28 PHP
JS中动态添加事件(绑定事件)的代码
2011/01/09 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
2016/03/05 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
2016/04/14 Javascript
jquery属性,遍历,HTML操作方法详解
2016/09/17 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
jQuery Easyui Treegrid实现显示checkbox功能
2017/08/08 jQuery
JavaScript选取(picking)和反选(rejecting)对象的属性方法
2017/08/16 Javascript
浅谈mint-ui 填坑之路
2017/11/06 Javascript
vue实现图片加载完成前的loading组件方法
2018/02/05 Javascript
Vue 中使用vue2-highcharts实现top功能的示例
2018/03/05 Javascript
详解使用vue-admin-template的优化历程
2018/05/20 Javascript
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
2019/09/18 Javascript
jQuery实现的移动端图片缩放功能组件示例
2020/05/01 jQuery
JS实现简易日历效果
2021/01/25 Javascript
[44:37]完美世界DOTA2联赛PWL S3 Forest vs access 第一场 12.11
2020/12/13 DOTA
[01:02:00]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第三场 1月24日
2021/03/11 DOTA
python sqlobject(mysql)中文乱码解决方法
2008/11/14 Python
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
pandas 按照特定顺序输出的实现代码
2018/07/10 Python
Python中__slots__属性介绍与基本使用方法
2018/09/05 Python
python 图像处理画一个正弦函数代码实例
2019/09/10 Python
基于python的selenium两种文件上传操作实现详解
2019/09/19 Python
python爬虫 Pyppeteer使用方法解析
2019/09/28 Python
flask框架json数据的拿取和返回操作示例
2019/11/28 Python
将不规则的Python多维数组拉平到一维的方法实现
2021/01/11 Python
UGG雪地靴荷兰官网:UGG荷兰
2016/09/09 全球购物
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
前台接待的工作职责
2013/11/21 职场文书
毕业生的自我评价分享
2013/12/18 职场文书
人事部专员岗位职责
2014/03/04 职场文书
销售团队激励口号
2014/06/06 职场文书