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的Tornado框架实现一个Web端图书展示页面
Jul 11 Python
Python查询IP地址归属完整代码
Jun 21 Python
基于循环神经网络(RNN)实现影评情感分类
Mar 26 Python
python Opencv将图片转为字符画
Feb 19 Python
Python加载带有注释的Json文件实例
May 23 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
Jul 19 Python
使用PyQt4 设置TextEdit背景的方法
Jun 14 Python
使用python turtle画高达
Jan 19 Python
pytorch masked_fill报错的解决
Feb 18 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
May 25 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
PyCharm MySQL可视化Database配置过程图解
Jun 09 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/19 PHP
Yii框架弹出框功能示例
2017/01/07 PHP
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
jQuery布局插件UI Layout简介及使用方法
2013/04/03 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
Vue过滤器的用法和自定义过滤器使用
2017/02/08 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
Axios学习笔记之使用方法教程
2017/07/21 Javascript
Angular实现类似博客评论的递归显示及获取回复评论的数据
2017/11/06 Javascript
JS中call和apply函数用法实例分析
2018/06/20 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
vue跳转页面的几种方法(推荐)
2020/03/26 Javascript
分析Python编程时利用wxPython来支持多线程的方法
2015/04/07 Python
在Django的模板中使用认证数据的方法
2015/07/23 Python
Python正则表达式使用范例分享
2016/12/04 Python
python3+PyQt5重新实现自定义数据拖放处理
2018/04/19 Python
Python地图绘制实操详解
2019/03/04 Python
python 3.7.4 安装 opencv的教程
2019/10/10 Python
Python Django框架防御CSRF攻击的方法分析
2019/10/18 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
2020/09/23 Python
requests在python中发送请求的实例讲解
2021/02/17 Python
使用CSS实现阅读进度条
2017/02/27 HTML / CSS
挪威户外活动服装和装备购物网站:Bergfreunde挪威
2016/10/20 全球购物
来自世界各地的优质葡萄酒:VineShop24
2018/07/09 全球购物
Ariat英国官网:为世界顶级马术运动员制造最优质的鞋类和服装
2020/02/14 全球购物
《我不是最弱小的》教学反思
2014/02/23 职场文书
授权委托书样本
2014/04/03 职场文书
2015年业务员工作总结范文
2015/04/07 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
贫困证明书范文
2015/06/16 职场文书
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle
剑指Offer之Java算法习题精讲二叉树专项训练
2022/03/21 Java/Android