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实现bitmap数据结构详解
Feb 17 Python
python3中bytes和string之间的互相转换
Feb 09 Python
python利用Guetzli批量压缩图片
Mar 23 Python
tensorflow实现图像的裁剪和填充方法
Jul 27 Python
用Python实现筛选文件脚本的方法
Oct 27 Python
numpy给array增加维度np.newaxis的实例
Nov 01 Python
selenium python 实现基本自动化测试的示例代码
Feb 25 Python
Python简单基础小程序的实例代码
Apr 28 Python
通过实例解析python描述符原理作用
Jan 22 Python
Django实现从数据库中获取到的数据转换为dict
Mar 27 Python
python实现图像外边界跟踪操作
Jul 13 Python
浅析NumPy 切片和索引
Sep 02 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里得到前天和昨天的日期的代码
2007/08/16 PHP
解析php 版获取重定向后的地址(代码)
2013/06/26 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
javascript的对话框详解与参数
2007/03/08 Javascript
js电信网通双线自动选择技巧
2008/11/18 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
2016/12/28 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
json的结构与遍历方法实例分析
2017/04/25 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
2018/12/24 Javascript
JS实现吸顶特效
2020/01/08 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
在Angular中实现一个级联效果的下拉框的示例代码
2020/05/20 Javascript
在NodeJs中使用node-schedule增加定时器任务的方法
2020/06/08 NodeJs
Python socket.error: [Errno 98] Address already in use的原因和解决方法
2014/08/25 Python
python中装饰器级连的使用方法示例
2017/09/29 Python
用pandas按列合并两个文件的实例
2018/04/12 Python
Python Series从0开始索引的方法
2018/11/06 Python
python提取xml里面的链接源码详解
2019/10/15 Python
Python垃圾回收机制三种实现方法
2020/04/27 Python
python3将变量输入的简单实例
2020/08/19 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的代码
2020/11/30 HTML / CSS
基于Canvas+Vue的弹幕组件的实现
2019/07/23 HTML / CSS
HTML5 Canvas draw方法制作动画效果示例
2013/07/11 HTML / CSS
家居饰品店创业计划书
2014/01/31 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
教师求职自荐信范文
2015/03/04 职场文书
大学生实习证明
2015/06/16 职场文书
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
Java 数组内置函数toArray详解
2021/06/28 Java/Android
Python 阶乘详解
2021/10/05 Python