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中的多重继承实例讲解
Sep 28 Python
Python中的with...as用法介绍
May 28 Python
使用python实现个性化词云的方法
Jun 16 Python
Python3使用PyQt5制作简单的画板/手写板实例
Oct 19 Python
python 将字符串转换成字典dict的各种方式总结
Mar 23 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
Python编程中flask的简介与简单使用
Dec 28 Python
pycharm修改界面主题颜色的方法
Jan 17 Python
python实现批量注册网站用户的示例
Feb 22 Python
python 经典数字滤波实例
Dec 16 Python
tensorflow 模型权重导出实例
Jan 24 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
Mar 03 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中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
2011/03/29 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
js 加载时自动调整图片大小
2008/05/28 Javascript
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
2013/11/14 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
JS+DIV实现鼠标划过切换层效果的实例代码
2013/11/26 Javascript
wap手机端解决返回上一页的js实例
2016/12/08 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
原生js实现焦点轮播图效果
2017/01/12 Javascript
百度地图API之百度地图退拽标记点获取经纬度的实现代码
2017/01/12 Javascript
vue实现一拉到底的滑动验证
2019/07/25 Javascript
js实现秒表计时器
2019/12/16 Javascript
Python 装饰器使用详解
2017/07/29 Python
Python3 中文文件读写方法
2018/01/23 Python
Python 使用with上下文实现计时功能
2018/03/09 Python
python实现猜数字小游戏
2020/03/24 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
Python操作rabbitMQ的示例代码
2019/03/19 Python
基于Tensorflow使用CPU而不用GPU问题的解决
2020/02/07 Python
Python实现七个基本算法的实例代码
2020/10/08 Python
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
美国顶级品牌男士大码服装店:DXL
2017/08/30 全球购物
马来西亚网上购物平台:ezbuy
2018/02/13 全球购物
瑞士隐形眼镜和护理产品网上商店:Linsenklick
2019/10/21 全球购物
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
数控技术专业推荐信
2013/11/01 职场文书
采购员岗位职责
2013/11/15 职场文书
工作的心得体会
2013/12/31 职场文书
西式婚礼主持词
2014/03/13 职场文书
献爱心捐款倡议书
2014/05/14 职场文书
教师职业道德事迹材料
2014/08/18 职场文书
2015世界地球日活动总结
2015/02/09 职场文书
高中教师个人工作总结
2015/02/10 职场文书
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python