python--基础知识点--pickle模块

1. 什么是Pickle?

您刚刚经历了一个耗时的过程,将一堆数据加载到python对象中。 也许你从数千个网站上爬取了数据。也许你计算了pi的数值。如果您的笔记本电脑电池耗尽或python崩溃,您的信息将丢失。

Pickling允许您将python对象保存为硬盘驱动器上的二进制文件。 在你pickle你的对象后,你可以结束你的python会话,重新启动你的计算机,然后再次将你的对象加载到python中。

如果需要,您可以将您的pickle文件备份到Google Drive或DropBox或普通的USB存储中。 你可以发邮件给朋友。

一句警告:不要加载你不信任的pkl文件。 恶意的人可以制作恶意的pkl文件,可能会在您的计算机上执行意外的代码(SQL注入,密码暴力强制等)。

Pickle用于序列化和反序列化Python对象结构,也称为marshalling或flattening。 序列化是指将内存中的对象转换为可以存储在磁盘上或通过网络发送的字节流的过程。之后,这个字符流可以被检索并将其反序列化回Python对象。 Pickle不要与压缩相混淆! 前者是将对象从一种表示(随机存取存储器(RAM)中的数据)转换为另一种表示(磁盘上的文本),而后者是使用较少位编码数据的过程,以节省磁盘空间。

2. Pickle可以做什么?

对于需要在数据中保持一定程度持久性的应用程序,Pickling非常有用。 您的程序的状态数据可以保存到磁盘,因此您可以稍后继续处理它。 它还可用于通过传输控制协议(TCP)或套接字连接(Socket)发送数据,或将python对象存储在数据库中。 当您使用机器学习算法时,Pickle非常有用,您可以将它们保存在以后能够进行新的预测,而无需重新编写所有内容或重新训练模型。

3. 什么时候不能使用Pickle?

如果要使用不同编程语言的数据,建议不要使用pickle。 它的协议特定于Python,因此不保证跨语言兼容性。 对于不同版本的Python本身也是如此。 不同版本的Python中反序列化Pickle的文件可能并不总是正常工作,因此您必须确保使用相同的版本并在必要时执行更新。您最好不要从不受信任的来源中反序列化数据。因为解压缩时可能会执行文件中的恶意代码。

4. 可使用pickle序列化的类型

python--基础知识点--pickle模块_第1张图片

5. 具体方法

5.1序列化方法

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

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

参数

  • protocol
    • 一共有5中不同的类型,即(0,1,2,3,4)。(0,1,2)对应的是python早期的版本,(3,4)则是在python3之后的版本。
    • 0表示ASCII协议,表示以文本的形式进行序列化;1和2表示以二进制的形式进行序列化,其中,1是老式的二进制协议,2是新二进制协议。
    • python3,pickle.HIGHEST_PROTOCOL的值为4。
    • python3,pickle.DEFAULT_PROTOCOL的值为3。
    • python3,当protocol参数为负数时,表示选择的参数是pickle.HIGHEST_PROTOCOL。
    • python3,未指定,则默认为DEFAULT_PROTOCOL。
  • fix_imports
    • 如果fix_imports为true且protocol小于3,则pickle将尝试将新的Python 3名称映射到Python 2中使用的旧模块名称,以便使用Python 2可读取pickle数据流。
import pickle


class A:
    def __init__(self):
        self.a = 2
        self.b = 3


a = A()
with open('abc.pkl', 'wb') as f:
    pickle.dump(a, f, protocol=4)

关于参数file,有一点需要注意,必须是以二进制的形式进行操作(写入)。
file为’svm_model_iris.pkl’,并且以二进制的形式('wb')写入。

补充

关于参数protocol,官方的详细介绍如下:
python--基础知识点--pickle模块_第2张图片
pickle.dumps(obj, protocol=None,*,fix_imports=True)

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

5.2 反序列化方法

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

反序列化对象。将文件中的数据解析为一个Python对象。

读取的时候,参数protocol是自动选择的,load()方法中没有这个参数。超过pickle对象的表示的字节将被忽略。

其中要注意的是,在load(file)的时候,要让python能够找到类的定义,否则会报错。

可选的关键字参数是fix_imports,encoding和errors,用于控制Python 2生成的pickle流的兼容性支持。如果fix_imports为true,则pickle将尝试将旧的Python 2名称映射到Python 3中使用的新名称。编码和 错误告诉pickle如何解码Python 2编码的8位字符串实例; 这些默认分别为’ASCII’和’strict’。该编码可以是“字节”作为字节对象读取这些8位串的实例。使用encoding='latin1’所需的取储存NumPy的阵列和实例datetime,date并且time被Python 2解码。

import pickle


class A:
    def __init__(self):
        self.a = 2
        self.b = 3


a = A()
with open('abc.pkl', 'wb') as f:
    pickle.dump(a, f, protocol=4)

with open('abc.pkl', 'rb') as f:
    b = pickle.load(f, encoding='')

print(b.a, b.b)


"""
运行结果:
2 3

Process finished with exit code 0
"""

关于参数file,有一点需要注意,必须是以二进制的形式进行操作(读取)。
file为’svm_model_iris.pkl’,并且以二进制的形式('rb')读取。

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

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

[参考博客]
https://www.cnblogs.com/baby-lily/p/10990026.html
https://www.cnblogs.com/xiaozx/p/10691406.html
https://blog.csdn.net/chunmi6974/article/details/78392230
https://www.jb51.net/article/135407.htm

你可能感兴趣的:(python,#,基础知识点)