Python中Pickle库的使⽤详解
在“通过简单⽰例来理解什么是机器学习”这篇⽂章⾥提到了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,官⽅的详细介绍如下:
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()⽅法的参数如下:
import pickle
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 那些类型可以进⾏序列化和反序列化操作
官⽅⽂档是这么介绍的,这⾥我就不进⼀步描述了。
写在后⾯
pickle模块还是⽐较实⽤的,当然,关于pickle模块,其实还有许多的信息可以去了解,想了解更多信
息的童鞋,建议可以阅读下python官⽅的API⽂档(library⽂件)。
以上所述是⼩编给⼤家介绍的Python 中Pickle库的使⽤详解,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编
会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。