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的Django框架中更新数据库数据的方法
Jul 17 Python
Python实现新浪博客备份的方法
Apr 27 Python
Python_LDA实现方法详解
Oct 25 Python
scrapy爬虫实例分享
Dec 28 Python
ubuntu安装sublime3并配置python3环境的方法
Mar 15 Python
Python实现读取机器硬件信息的方法示例
Jun 09 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
Jul 04 Python
Python实现将通信达.day文件读取为DataFrame
Dec 22 Python
python石头剪刀布小游戏(三局两胜制)
Jan 20 Python
pyqt5实现登录界面的模板
May 30 Python
Python基于callable函数检测对象是否可被调用
Oct 16 Python
详解使用scrapy进行模拟登陆三种方式
Feb 21 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/01/01 PHP
PHP中文竖排转换实现方法
2015/10/23 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
基于PHP实现微信小程序客服消息功能
2019/08/12 PHP
Yii框架模拟组件调用注入示例
2019/11/11 PHP
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
网上应用的一个不错common.js脚本
2007/08/08 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
javascript变量声明实例分析
2015/04/25 Javascript
使用jquery插件qrcode生成二维码
2015/10/22 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
微信小程序 新建登录页并实现tabBar隐藏
2017/06/13 Javascript
ES6中Class类的静态方法实例小结
2017/10/28 Javascript
vue中父子组件注意事项,传值及slot应用技巧
2018/05/09 Javascript
小程序实现列表删除功能
2018/10/30 Javascript
Vue一个案例引发的递归组件的使用详解
2018/11/15 Javascript
深入理解vue中的slot与slot-scope
2019/04/22 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
微信小程序使用Vant Weapp组件库的方法步骤
2019/08/01 Javascript
小程序实现锚点滑动效果
2019/09/23 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
python事件驱动event实现详解
2018/11/21 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
Python 使用folium绘制leaflet地图的实现方法
2019/07/05 Python
Django之路由层的实现
2019/09/09 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
CSS3动画效果回调处理详解
2014/12/10 HTML / CSS
探究 canvas 绘图中撤销(undo)功能的实现方式详解
2018/05/17 HTML / CSS
医学专业个人求职自荐信格式
2013/09/23 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
大学生迟到检讨书500字
2014/10/17 职场文书
python spilt()分隔字符串的实现示例
2021/05/21 Python
Hive导入csv文件示例
2022/06/25 数据库
python pandas 解析(读取、写入)CSV 文件的操作方法
2022/12/24 Python