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判断某个用户对某个文件的权限
Oct 13 Python
python3实现ftp服务功能(服务端 For Linux)
Mar 24 Python
python如何读写json数据
Mar 21 Python
详解Python如何生成词云的方法
Jun 01 Python
python 用lambda函数替换for循环的方法
Jun 09 Python
Dlib+OpenCV深度学习人脸识别的方法示例
May 14 Python
python之生产者消费者模型实现详解
Jul 27 Python
Python测试模块doctest使用解析
Aug 10 Python
Python基于百度AI实现OCR文字识别
Apr 02 Python
python实现小程序推送页面收录脚本
Apr 20 Python
Python scrapy爬取小说代码案例详解
Jul 09 Python
python使用bs4爬取boss直聘静态页面
Oct 10 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守护另一个php进程的例子
2015/02/13 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
面向对象的编程思想在javascript中的运用上部
2009/11/20 Javascript
jQuery解决iframe高度自适应代码
2009/12/20 Javascript
理解JAVASCRIPT中hasOwnProperty()的作用
2013/06/05 Javascript
jQuery 属性选择器element[herf*='value']使用示例
2013/10/20 Javascript
JS中的数组的sort方法使用示例
2014/01/22 Javascript
Javascript实现div的toggle效果实例分析
2015/06/09 Javascript
js上下视差滚动简单实现代码
2017/03/07 Javascript
Express + Session 实现登录验证功能
2017/09/08 Javascript
微信小程序富文本渲染引擎的详解
2017/09/30 Javascript
nodeJS模块简单用法示例
2018/04/21 NodeJs
5分钟学会Vue动画效果(小结)
2018/07/21 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
2018/09/07 jQuery
微信小程序实现比较功能的方法汇总(五种方法)
2020/03/07 Javascript
ES5新增数组的实现方法
2020/05/12 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
Python实现向QQ群成员自动发邮件的方法
2014/11/19 Python
Python模拟登陆实现代码
2017/06/14 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
在django中图片上传的格式校验及大小方法
2019/07/28 Python
Python (Win)readline和tab补全的安装方法
2019/08/27 Python
Python-openCV读RGB通道图实例
2020/01/17 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
2020/03/02 Python
JupyterNotebook 输出窗口的显示效果调整方法
2020/04/13 Python
Html5页面在微信端的分享的实现方法
2018/08/30 HTML / CSS
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
2018/02/01 HTML / CSS
努比亚手机官网:nubia
2016/10/06 全球购物
大学军训感想
2014/02/12 职场文书
2014年五一劳动节社区活动总结
2014/04/14 职场文书
学校春季防火方案
2014/06/08 职场文书
幼儿园安全工作总结2015
2015/04/20 职场文书
党支部综合考察意见
2015/06/01 职场文书
大学开学感言
2015/08/01 职场文书