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 RuntimeError: thread.__init__() not called解决方法
Apr 28 Python
Python二分查找详解
Sep 13 Python
python版简单工厂模式
Oct 16 Python
纯python实现机器学习之kNN算法示例
Mar 01 Python
Python3读取Excel数据存入MySQL的方法
May 04 Python
python 剪切移动文件的实现代码
Aug 02 Python
Django处理多用户类型的方法介绍
May 18 Python
浅析Python与Mongodb数据库之间的操作方法
Jul 01 Python
Python pip 安装与使用(安装、更新、删除)
Oct 06 Python
在pycharm中关掉ipython console/PyDev操作
Jun 09 Python
Python 机器学习工具包SKlearn的安装与使用
May 14 Python
Python列表的索引与切片
Apr 07 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面向对象全攻略 (五) 封装性
2009/09/30 PHP
Json对象替换字符串占位符实现代码
2010/11/17 Javascript
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
jquery 实现窗口的最大化不论什么情况
2013/09/03 Javascript
javascript中call apply 的应用场景
2015/04/16 Javascript
js为什么不能正确处理小数运算?
2015/12/29 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
简单谈谈原生js的math对象
2017/06/27 Javascript
d3.js实现自定义多y轴折线图的示例代码
2018/05/30 Javascript
解决vue项目使用font-awesome,build后路径的问题
2018/09/01 Javascript
JavaScript实现简单音乐播放器
2020/04/17 Javascript
JS删除String里某个字符的方法
2021/01/06 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
2019/07/16 Javascript
js 解析 JSON 数据简单示例
2020/04/21 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
python中range()与xrange()用法分析
2016/09/21 Python
Python设计模式之命令模式简单示例
2018/01/10 Python
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
python实现随机调用一个浏览器打开网页
2018/04/21 Python
使用Django搭建web服务器的例子(最最正确的方式)
2019/08/29 Python
python生成并处理uuid的实现方式
2020/03/03 Python
Python使用pyexecjs代码案例解析
2020/07/13 Python
Python paramiko使用方法代码汇总
2020/11/20 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
2020/12/28 Python
深入理解HTML的FormData对象
2016/05/17 HTML / CSS
Crocs欧洲官网:Crocs Europe
2020/01/14 全球购物
How to spawning asynchronous work in J2EE
2016/08/29 面试题
计算机科学与技术应届生求职信
2013/11/07 职场文书
电气工程和自动化自荐信范文
2013/12/25 职场文书
淘宝好评语大全
2014/05/05 职场文书
教师四风对照检查材料思想汇报
2014/09/17 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
刑事撤诉申请书
2015/05/18 职场文书
2016公司新年问候语
2015/11/11 职场文书
Oracle更换为MySQL遇到的问题及解决
2021/05/21 Oracle