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中使用sys模板和logging模块获取行号和函数名的方法
Apr 15 Python
详解python进行mp3格式判断
Dec 23 Python
单链表反转python实现代码示例
Feb 08 Python
python逆序打印各位数字的方法
Jun 25 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
Python实现查找最小的k个数示例【两种解法】
Jan 08 Python
python+pyqt5实现图片批量缩放工具
Mar 18 Python
python分数表示方式和写法
Jun 26 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
Feb 28 Python
python中delattr删除对象方法的代码分析
Dec 15 Python
Python机器学习之基础概述
May 19 Python
Python Flask搭建yolov3目标检测系统详解流程
Nov 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
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
CodeIgniter启用缓存和清除缓存的方法
2014/06/12 PHP
简单谈谈php中ob_flush和flush的区别
2014/11/27 PHP
Yii框架获取当前controlle和action对应id的方法
2014/12/03 PHP
php判断对象是派生自哪个类的方法
2015/06/20 PHP
分享php多功能图片处理类
2016/05/15 PHP
PHP实现获取第一个中文首字母并进行排序的方法
2017/05/09 PHP
在Laravel中使用MongoDB的方法示例
2019/11/11 PHP
鼠标移动到一张图片时变为另一张图片
2006/12/05 Javascript
二级域名或跨域共享Cookies的实现方法
2008/08/07 Javascript
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
jQuery固定浮动侧边栏实现思路及代码
2014/09/28 Javascript
多种jQuery绑定事件的实现方式
2016/06/13 Javascript
细数JavaScript 一个等号,两个等号,三个等号的区别
2016/10/09 Javascript
微信小程序 教程之wxapp视图容器 swiper
2016/10/19 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
vue项目中使用百度地图的方法
2018/06/08 Javascript
Vue+axios实现统一接口管理的方法
2018/07/23 Javascript
vue引入静态js文件的方法
2020/06/20 Javascript
解决vue路由name同名,路由重复的问题
2020/08/05 Javascript
pygame实现弹力球及其变速效果
2017/07/03 Python
python 利用栈和队列模拟递归的过程
2018/05/29 Python
python调用c++ ctype list传数组或者返回数组的方法
2019/02/13 Python
python实现倒计时小工具
2019/07/29 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
Python中文分词库jieba,pkusegwg性能准确度比较
2020/02/11 Python
css3学习心得分享
2013/08/19 HTML / CSS
css3学习系列之移动属性详解
2017/07/04 HTML / CSS
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
银河香水:Galaxy Perfume
2019/03/25 全球购物
会计电算化专业个人的自我评价
2013/11/24 职场文书
优秀党支部事迹材料
2014/01/14 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
中职班主任培训心得体会
2016/01/07 职场文书
导游词之无锡丝业博物馆
2019/11/12 职场文书