Python 中Pickle库的使用详解


Posted in Python onFebruary 24, 2018

在“通过简单示例来理解什么是机器学习”这篇文章里提到了pickle库的使用,本文来做进一步的阐述。

那么为什么需要序列化和反序列化这一操作呢?

1.便于存储。序列化过程将文本信息转变为二进制数据流。这样就信息就容易存储在硬盘之中,当需要读取文件的时候,从硬盘中读取数据,然后再将其反序列化便可以得到原始的数据。在Python程序运行中得到了一些字符串、列表、字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就丢失数据。python模块大全中的Pickle模块就派上用场了,它可以将对象转换为一种可以传输或存储的格式。

2.便于传输。当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把?个对象转换为字节序列,在能在网络上传输;接收方则需要把字节序列在恢复为对象。

通过简单示例来理解什么是机器学习

pickle是python语言的一个标准模块,安装python后已包含pickle库,不需要单独再安装。

pickle模块实现了基本的数据序列化和反序列化。通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储;通过pickle模块的反序列化操作,我们能够从文件中创建上一次程序保存的对象。

在官方的介绍中,序列化操作的英文描述有好几个单词,如”serializing”, “pickling”, “serialization”, “marshalling” 或者”flattening”等,它们都代表的是序列化的意思。相应的,反序列化操作的英文单词也有好多个,如”de-serializing”, “unpickling”, “deserailization”等。为了避免混淆,一般用”pickling”/“unpickling”, 或者”serialization”/“deserailization”。

pickle模块是以二进制的形式序列化后保存到文件中(保存文件的后缀为”.pkl”),不能直接打开进行预览。而python的另一个序列化标准模块json,则是human-readable的,可以直接打开查看(例如在notepad++中查看)。

pickle模块有两类主要的接口,即序列化和反序列化。

其中序列化操作包括:

pickle.dump()
Pickler(file, protocol).dump(obj)

反序列化操作包括:

pickle.load()
Unpickler(file).load()

2 序列化操作

2.1 序列化方法pickle.dump()

序列化的方法为 pickle.dump(),该方法的相关参数如下:

pickle.dump(obj, file, protocol=None,*,fix_imports=True)

该方法实现的是将序列化后的对象obj以二进制形式写入文件file中,进行保存。它的功能等同于 Pickler(file, protocol).dump(obj)。

关于参数file,有一点需要注意,必须是以二进制的形式进行操作(写入)。

参考前文的案例如下:

import picklewith open('svm_model_iris.pkl', 'wb') as f:
 pickle.dump(svm_classifier, f)

file为'svm_model_iris.pkl',并且以二进制的形式('wb')写入。

关于参数protocol,一共有5中不同的类型,即(0,1,2,3,4)。(0,1,2)对应的是python早期的版本,(3,4)则是在python3之后的版本。

此外,参数可选 pickle.HIGHEST_PROTOCOL和pickle.DEFAULT_PROTOCOL。当前,python3.5版本中,pickle.HIGHEST_PROTOCOL的值为4,pickle.DEFAULT_PROTOCOL的值为3。当protocol参数为负数时,表示选择的参数是pickle.HIGHEST_PROTOCOL。

关于参数protocol,官方的详细介绍如下:

Python 中Pickle库的使用详解

2.2 序列化方法pickle.dumps()

pickle.dumps()方法的参数如下:

pickle.dumps(obj, protocol=None,*,fix_imports=True)

pickle.dumps()方法跟pickle.dump()方法的区别在于,pickle.dumps()方法不需要写入文件中,它是直接返回一个序列化的bytes对象。

2.3 序列化方法Pickler(file, protocol).dump(obj)

pickle模块提供了序列化的面向对象的类方法,即 class pickle.Pickler(file, protocol=None,*,fix_imports=True),Pickler类有dump()方法。

Pickler(file, protocol).dump(obj) 实现的功能跟 pickle.dump() 是一样的。

关于Pickler类的其他method,请参考官方API。

插播一条硬广:技术文章转发太多,本文来自微信公众号:“Python数据之道”(ID:PyDataRoad)。

3 反序列化操作

3.1 反序列化方法pickle.load()

序列化的方法为 pickle.load(),该方法的相关参数如下:

pickle.load(file, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)

该方法实现的是将序列化的对象从文件file中读取出来。它的功能等同于 Unpickler(file).load()。

关于参数file,有一点需要注意,必须是以二进制的形式进行操作(读取)。

参考前文的案例如下:

import picklewith open('svm_model_iris.pkl', 'rb') as f:
 model = pickle.load(f)

file为'svm_model_iris.pkl',并且以二进制的形式('rb')读取。

读取的时候,参数protocol是自动选择的,load()方法中没有这个参数。

3.2 反序列化方法pickle.loads()

pickle.loads()方法的参数如下:

pickle.loads(bytes_object, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)

pickle.loads()方法跟pickle.load()方法的区别在于,pickle.loads()方法是直接从bytes对象中读取序列化的信息,而非从文件中读取。

3.3 反序列化方法Unpickler(file).load()

pickle模块提供了反序列化的面向对象的类方法,即 class pickle.Unpickler(file, *,fix_imports=True, encoding="ASCII". errors="strict"),Pickler类有load()方法。

Unpickler(file).load() 实现的功能跟 pickle.load() 是一样的。

关于Unpickler类的其他method,请参考官方API。

4 那些类型可以进行序列化和反序列化操作

官方文档是这么介绍的,这里我就不进一步描述了。

Python 中Pickle库的使用详解

写在后面

pickle模块还是比较实用的,当然,关于pickle模块,其实还有许多的信息可以去了解,想了解更多信息的童鞋,建议可以阅读下python官方的API文档(library文件)。

以上所述是小编给大家介绍的Python 中Pickle库的使用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python 学习笔记
Dec 27 Python
Python运行的17个时新手常见错误小结
Aug 07 Python
Python中使用item()方法遍历字典的例子
Aug 26 Python
Python基类函数的重载与调用实例分析
Jan 12 Python
在Django中管理Users和Permissions以及Groups的方法
Jul 23 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
Jan 24 Python
Python 文件处理注意事项总结
Apr 10 Python
Python爬取当当、京东、亚马逊图书信息代码实例
Dec 09 Python
Python 数据处理库 pandas 入门教程基本操作
Apr 19 Python
python 求一个列表中所有元素的乘积实例
Jun 11 Python
树莓派+摄像头实现对移动物体的检测
Jun 22 Python
pytorch随机采样操作SubsetRandomSampler()
Jul 07 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
Feb 24 #Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 #Python
Python3实现带附件的定时发送邮件功能
Dec 22 #Python
python正则实现提取电话功能
Feb 24 #Python
python3实现公众号每日定时发送日报和图片
Feb 24 #Python
详解如何在python中读写和存储matlab的数据文件(*.mat)
Feb 24 #Python
使用python和pygame绘制繁花曲线的方法
Feb 24 #Python
You might like
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
2013/03/06 PHP
使用php批量删除数据库下所有前缀为prefix_的表
2014/06/09 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
2014/11/18 PHP
浅谈php中变量的数据类型判断函数
2017/03/04 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
2017/10/13 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
stripos函数知识点实例分享
2019/02/11 PHP
window.onload 加载完毕的问题及解决方案(下)
2009/07/09 Javascript
javascript new后的constructor属性
2010/08/05 Javascript
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
jQuery显示和隐藏 常用的状态判断方法
2015/01/29 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
js验证真实姓名与身份证号,手机号的简单实例
2016/07/18 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
利用百度地图API获取当前位置信息的实例
2017/11/06 Javascript
Vue中div contenteditable 的光标定位方法
2018/08/25 Javascript
微信内置浏览器图片查看器的代码实例
2019/10/08 Javascript
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
js中的面向对象之对象常见创建方法详解
2019/12/16 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
python使用BeautifulSoup分页网页中超链接的方法
2015/04/04 Python
python传递参数方式小结
2015/04/17 Python
python-itchat 获取微信群用户信息的实例
2019/02/21 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
ALDI奥乐齐官方海外旗舰店:德国百年超市
2017/12/27 全球购物
UGG美国官网:购买UGG雪地靴、拖鞋和鞋子
2017/12/31 全球购物
strstr()的简单实现
2013/09/26 面试题
大一军训感言
2014/01/09 职场文书
党委干部批评与自我批评发言稿
2014/09/28 职场文书
父亲去世追悼词
2015/06/23 职场文书
高中生社会实践心得体会
2016/01/14 职场文书
2019自荐信该如何写呢?
2019/07/05 职场文书
方法汇总:Python 安装第三方库常用
2022/04/26 Python