Python 中 Pickle 库的使用详解
介绍
pickle是python语言的一个标准模块,安装python后已包含pickle库,不需要单独再安装。
为什么需要序列化和反序列化这一操作呢?
1.便于存储。序列化过程将文本信息转变为二进制数据流。这样就信息就容易存储在硬盘之中,当需要读取文件的时候,从硬盘中读取数据,然后再将其反序列化便可以得到原始的数据。在Python程序运行中得到了一些字符串、列表、字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就丢失数据。python模块大全中的Pickle模块就派上用场了,它可以将对象转换为一种可以传输或存储的格式。
2.便于传输。当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把這个对象转换为字节序列,在能在网络上传输;接收方则需要把字节序列在恢复为对象。
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 pickle
with 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。
2.2 序列化方法pickle.dumps()
pickle.dumps()方法的参数如下:
pickle.dumps(obj, protocol=None,*,fix_imports=True)
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。
3 反序列化操作
3.1 反序列化方法pickle.load()
序列化的方法为 pickle.load(),该方法的相关参数如下:
pickle.load(file, *,fix_imports=True, encoding=”ASCII”. errors=”strict”)
参考前文的案例如下:
import pickle
with 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。
相关文章
- Python免杀过360
- Python开发Brup插件检测SSRF漏洞和URL跳转
- python写一个能变身电光耗子的贪吃蛇
- Python分布式爬虫框架Scrapy 打造搜索引擎(四) - 爬取博客网站
- 万能调试|Python Scrapy框架HTTP代理的配置与调试
- 【好书推荐】《Python黑魔法指南》-附高清PDF版
- C、C++、Java到Python,编程入门学习什么语言好?
- Python 安装
- Python 3.11正式版来了,比3.10快10-60%,官方:这或许是最好的版本
- 基于Python的OpenCV关于色彩空间与通道的操作
- 2023PyCharm激活,码上使用,最新可用,Python快速使用
- 独家 | 使用python马尔科夫链方法建模星巴克等待时长
- 解放双手,python实现自动刷抖音短视频
- 用Python破解压缩包解压密码代码
- Python快速爬取车标网图片,以后不要说这什么车你不认识了!
- 抖音上超好听的神曲音乐,Python教你一次性下载
- 基于Atlas 200 DK的原版YOLOv3(基于Darknet-53)实现(Python版本)
- Python大神编程常用4大工具,你用过几个?
- Python自动化测试Selenium+chrome连接HTTP代理(账密+白名单)
- Python HTTP代理的优缺点?芝麻代理豌豆代理熊猫代理讯代理?