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

本文深入探讨了Python中的Pickle模块,讲解了其基本概念、应用场景、限制条件及序列化与反序列化方法。Pickle用于保存Python对象状态,实现数据持久化,适用于数据交换与机器学习模型保存。
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序列化的类型

在这里插入图片描述

5. 具体方法
5.1序列化方法

pickle.dump(obj, file, protocol=None,*,fix_imports=True)是 Python 中用于将 Python 对象序列化为字节流并写入文件的函数。下面是各参数的说明:

  • obj: 要序列化为字节流的 Python 对象。
  • file: 文件对象(file-like object),通常是以写入二进制模式打开的文件(例如通过 open() 函数以 ‘wb’ 模式打开的文件)。序列化后的字节流将被写入到该文件对象中。
  • protocol (可选): 序列化协议的版本号,可以是 0、1、2、3 或 4。如果未指定该参数,则使用默认的协议版本。不同的协议版本在效率和兼容性方面有所不同,具体选择哪个版本取决于你的需求。【0、1、2是python2,3、4是python3】
  • fix_imports (可选): 一个布尔值,表示是否在序列化时尝试修复旧的 Python 2 导入语句(默认为 True)。在 Python 2 中,模块的导入语句可能会不同于 Python 3,设置 fix_imports=True 可以确保在加载时能够正确地导入模块。
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,官方的详细介绍如下:
在这里插入图片描述
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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值