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 相关文章推荐
Django的session中对于用户验证的支持
Jul 23 Python
Python实现excel转sqlite的方法
Jul 17 Python
python3 中文乱码与默认编码格式设定方法
Oct 31 Python
python 划分数据集为训练集和测试集的方法
Dec 11 Python
python tkinter库实现气泡屏保和锁屏
Jul 29 Python
django中使用POST方法获取POST数据
Aug 20 Python
python实现最大优先队列
Aug 29 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
Nov 11 Python
Python3将jpg转为pdf文件的方法示例
Dec 13 Python
对tensorflow 中tile函数的使用详解
Feb 07 Python
pandas中的数据去重处理的实现方法
Feb 10 Python
利用python爬取有道词典的方法
Dec 08 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中文分词的简单实现代码分享
2011/07/17 PHP
提高php运行速度的一些小技巧分享
2012/07/03 PHP
php实现12306余票查询、价格查询示例
2014/04/17 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
2014/07/29 PHP
PHP curl 抓取AJAX异步内容示例
2014/09/09 PHP
javascript 动态参数判空操作
2008/12/22 Javascript
JavaScript 自动完成脚本整理(33个)
2009/10/20 Javascript
基于jquery的气泡提示效果
2010/05/31 Javascript
JQuery 获取Dom元素的实例讲解
2017/07/08 jQuery
weebox弹出窗口不居中显示的解决方法
2017/11/27 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
js动态设置select下拉菜单的默认选中项实例
2018/08/21 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
Vue+element+cookie记住密码功能的简单实现方法
2020/09/20 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
[02:06]DOTA2肉山黑名单魔法终结者 敌法师中文配音鉴赏
2013/06/17 DOTA
python进阶_浅谈面向对象进阶
2017/08/17 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
Python实用技巧之列表、字典、集合中根据条件筛选数据详解
2018/07/11 Python
python 产生token及token验证的方法
2018/12/26 Python
python实现拼图小游戏
2020/02/22 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
乌克兰设计师和品牌的服装:Love&Live
2020/04/14 全球购物
对公司合理化的建议书
2014/03/12 职场文书
租房协议书范文
2014/08/20 职场文书
2014年销售人员工作总结
2014/11/27 职场文书
支教个人总结
2015/03/04 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
项目验收申请报告
2015/05/15 职场文书
党员证明信
2015/06/19 职场文书
2015大一新生军训感言
2015/08/01 职场文书
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python
十个Python自动化常用操作,即拿即用
2021/05/10 Python
MySQL库表名大小写的选择
2021/06/05 MySQL