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爬虫之爬虫框架Scrapy安装配置
Nov 06 Python
Python中__new__与__init__方法的区别详解
May 04 Python
玩转python爬虫之爬取糗事百科段子
Feb 17 Python
Python中is与==判断的区别
Mar 28 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
Jul 17 Python
Python IDE环境之 新版Pycharm安装详细教程
Mar 05 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
Mar 16 Python
python如何使用腾讯云发送短信
Sep 17 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
Dec 05 Python
python引入其他文件夹下的py文件具体方法
May 23 Python
python ansible自动化运维工具执行流程
Jun 24 Python
python神经网络Xception模型
May 06 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 解决session死锁的方法
2013/06/20 PHP
ThinkPHP令牌验证实例
2014/06/18 PHP
PHP实用函数分享之去除多余的0
2015/02/06 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
谷歌浏览器 insertCell与appendChild的区别
2009/02/12 Javascript
Javascript的一种模块模式
2010/09/08 Javascript
禁止你的左键复制实用技巧
2013/01/04 Javascript
Jquery submit()无法提交问题
2013/04/21 Javascript
js中符号转意问题示例探讨
2013/08/19 Javascript
Javascript中String的常用方法实例分析
2015/06/13 Javascript
使用AngularJS编写较为优美的JavaScript代码指南
2015/06/19 Javascript
javascript中mouseover、mouseout使用详解
2015/07/19 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
AngularJS 输入验证详解及实例代码
2016/07/28 Javascript
vue2.0结合Element实现select动态控制input禁用实例
2017/05/12 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
基于substring()和substr()的使用以及区别(实例讲解)
2017/12/28 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
2019/09/01 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
python爬取网站数据保存使用的方法
2013/11/20 Python
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
深入理解Python中的内置常量
2017/05/20 Python
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
Python批量启动多线程代码实例
2020/02/18 Python
Pytorch 中的optimizer使用说明
2021/03/03 Python
Python与C/C++的相互调用案例
2021/03/04 Python
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
Shopbop中文官网:美国亚马逊旗下时尚购物网站
2020/12/15 全球购物
安全生产责任书范本
2014/04/15 职场文书
班主任工作实习计划
2015/01/16 职场文书
世界遗产导游词
2015/02/13 职场文书
行政介绍信范文
2015/05/04 职场文书
婚姻出轨保证书
2015/05/08 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书
浅析Python中的套接字编程
2021/06/22 Python