首页 > 编程语言 >Python pickle 二进制序列化和反序列化 - 数据持久化

Python pickle 二进制序列化和反序列化 - 数据持久化

时间:2024-01-17 09:13:43浏览次数:28  
标签:二进制 Python pickle 对象 序列化 data

模块 pickle 实现了对一个 Python 对象结构的二进制序列化和反序列化。 "pickling" 是将 Python 对象及其所拥有的层次结构转化为一个字节流的过程,而 "unpickling" 是相反的操作,会将(来自一个 binary file 或者 bytes-like object 的)字节流转化回一个对象层次结构。 pickling(和 unpickling)也被称为“序列化”, “编组” 1 或者 “平面化”。而为了避免混乱,此处采用术语 “封存 (pickling)” 和 “解封 (unpickling)”。

pickle 模块 并不安全。 你只应该对你信任的数据进行 unpickle 操作。
构建恶意的 pickle 数据来 在解封时执行任意代码 是可能的。 绝对不要对不信任来源的数据和可能被篡改过的数据进行解封。
请考虑使用 hmac 来对数据进行签名,确保数据没有被篡改。
在你处理不信任数据时,更安全的序列化格式如 json 可能更为适合。

与 json 模块的比较

在 pickle 协议和 JSON (JavaScript Object Notation) 之间有着本质上的差异:

  • JSON 是一个文本序列化格式(它输出 unicode 文本,尽管在大多数时候它会接着以 utf-8 编码),而 pickle 是一个二进制序列化格式;
  • JSON 是我们可以直观阅读的,而 pickle 不是;
  • JSON是可互操作的,在Python系统之外广泛使用,而pickle则是Python专用的;
  • 默认情况下,JSON 只能表示 Python 内置类型的子集,不能表示自定义的类;但 pickle 可以表示大量的 Python 数据类型(可以合理使用 Python 的对象内省功能自动地表示大多数类型,复杂情况可以通过实现 specific object APIs 来解决)。
  • 不像pickle,对一个不信任的JSON进行反序列化的操作本身不会造成任意代码执行漏洞。

Pickle的基本用法

序列化(Pickling)

要将Python对象序列化为二进制数据,可以使用pickle.dump()函数。以下是一个简单的示例,将一个Python列表保存到文件中:

import pickle

data = [1, 2, 3, 4, 5]

# 打开一个文件以写入二进制数据
with open('data/data.pkl', 'wb') as file:
    pickle.dump(data, file)

在上述代码中,使用pickle.dump()函数将data列表序列化为二进制数据,并将其保存到名为data.pkl的文件中。参数'wb'表示以二进制写入模式打开文件。

反序列化(Unpickling)

要从文件中加载并反序列化二进制数据,可以使用pickle.load()函数。以下是加载data.pkl文件并还原Python对象的示例:

import pickle

# 打开文件以读取二进制数据
with open('data/data.pkl', 'rb') as file:
    loaded_data = pickle.load(file)

print("反序列化 %s" % loaded_data)

在上述代码中,使用pickle.load()函数从data.pkl文件中加载数据,并将其还原为Python对象。

Pickle的工作原理

pickle模块的工作原理涉及到将Python对象转换为一种可序列化的中间格式,然后再将该中间格式序列化为二进制数据。这个中间格式是一个自包含的表示对象的字典,其中包含了对象的数据和其类型信息。

当使用pickle.dump()序列化对象时,pickle 模块首先创建一个包含对象数据和类型信息的中间字典。然后,它将该字典转换为二进制数据。反序列化时,pickle模块将二进制数据还原为中间字典,然后再从字典中还原Python对象。

这种方法使pickle模块非常灵活,因为它可以序列化几乎所有Python对象,包括自定义对象,只要它们可以在中间字典中表示。

Pickle的适用场景

pickle模块在以下情况下非常有用:

  • 数据持久化:你可以使用pickle将Python对象保存到文件中,以便稍后读取。这对于保存模型、配置文件、数据缓存等非常有用。
  • 数据传输:你可以使用pickle将Python对象序列化并通过网络传输,以便不同的Python程序之间共享数据。
  • 对象复制:你可以使用pickle将Python对象进行深拷贝,以便创建对象的独立副本,而不是引用原始对象。
  • 测试和调试:pickle也用于创建模拟数据,以便进行测试和调试。

Pickle的注意事项

尽管pickle非常方便,但在使用它时需要注意一些事项:

  • 安全性:反序列化数据时要小心,因为pickle可以执行任意代码。不要从不受信任的来源加载pickle数据,以免遭受安全风险。
  • 版本兼容性:在不同版本的Python之间,pickle数据的兼容性可能会有问题。因此,确保在不同版本之间测试并验证pickle数据的兼容性。
  • 自定义对象:一些自定义对象的序列化和反序列化可能会受到限制,因此需要额外的配置。你可能需要实现特定的__reduce__方法来控制对象的序列化行为。

示例代码

以下是一个示例代码,演示如何使用pickle模块来序列化和反序列化一个自定义Python对象:

import pickle

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return f"Person(name='{self.name}', age={self.age})"


# 创建一个自定义对象
person = Person("Alice", 30)

# 序列化并保存到文件
with open('data/person.pkl', 'wb') as file:
    pickle.dump(person, file)

# 从文件中加载并反序列化
with open('data/person.pkl', 'rb') as file:
    loaded_person = pickle.load(file)

print(loaded_person)  # 输出: Person(name='Alice', age=30)

在上述代码中,我们首先定义了一个自定义类Person,然后创建了一个Person对象。我们使用pickle将该对象序列化为二进制数据,然后再从二进制数据中反序列化还原对象。

标签:二进制,Python,pickle,对象,序列化,data
From: https://www.cnblogs.com/vipsoft/p/17968204

相关文章

  • 使用 Python 创造你自己的计算机游戏(游戏编程快速上手)第四版:第十五章到第十八章
    十五、反转棋游戏原文:inventwithpython.com/invent4thed/chapter15.html译者:飞龙协议:CCBY-NC-SA4.0在本章中,我们将制作反转棋,也称为黑白棋或奥赛罗。这个双人棋盘游戏是在网格上进行的,因此我们将使用带有x和y坐标的笛卡尔坐标系。我们的游戏版本将具有比第10章中的......
  • 20230116python基本语法day1
    20230116python基本语法day1代码看一行写一行。菜鸟教程python3成为自己尊重自己欣赏的自己。注意点:python中,#TODO待处理,显示为黄色,这边的问题要在最后解决掉,这很重要。在java中可能是//TODO    解释器的作用是运行文件,给代码解释文件。......
  • 使用 Python 创造你自己的计算机游戏(游戏编程快速上手)第四版:第十九章到第二十一章
    十九、碰撞检测原文:inventwithpython.com/invent4thed/chapter19.html译者:飞龙协议:CCBY-NC-SA4.0碰撞检测涉及确定屏幕上的两个物体何时相互接触(即发生碰撞)。碰撞检测对于游戏非常有用。例如,如果玩家触碰到敌人,他们可能会失去生命值。或者如果玩家触碰到硬币,他们应该自动......
  • 使用 Python 创造你自己的计算机游戏(游戏编程快速上手)第四版:第五章到第九章
    五、龙之境原文:inventwithpython.com/invent4thed/chapter5.html译者:飞龙协议:CCBY-NC-SA4.0本章中您将创建的游戏名为龙之境。玩家需要在两个洞穴之间做出选择,这两个洞穴分别藏有宝藏和一定的厄运。如何玩龙之境在这个游戏中,玩家身处一个充满龙的土地。这些龙都住在洞......
  • 使用 Python 创造你自己的计算机游戏(游戏编程快速上手)第四版:第十章到第十四章
    十、井字棋原文:inventwithpython.com/invent4thed/chapter10.html译者:飞龙协议:CCBY-NC-SA4.0本章介绍了一个井字棋游戏。井字棋通常由两个人玩。一个玩家是X,另一个玩家是O。玩家轮流放置他们的X或O。如果一个玩家在一行、一列或对角线上获得了三个标记,他们就赢了。当棋盘......
  • python语音识别whisper的使用
    Python语音识别Whisper的使用语音识别是一项具有广泛应用的技术,它使得计算机可以理解人类的语音指令并作出相应的反应。在众多的语音识别工具中,Whisper是一个基于Python的开源库,它提供了简单易用的语音识别功能。本文将介绍Whisper的基本概念和使用方法,并通过代码示例来演示其功能......
  • 使用 Python 创造你自己的计算机游戏(游戏编程快速上手)第四版:致谢到第四章
    致谢原文:inventwithpython.com/invent4thed/chapter0.html译者:飞龙协议:CCBY-NC-SA4.0没有NoStarchPress团队的出色工作,这本书就不可能问世。感谢我的出版商BillPollock;感谢我的编辑LaurelChun、JanCash和TylerOrtman,在整个过程中给予我的难以置信的帮助;感谢我......
  • Python的安装配置
    Python的安装配置​ 博主之前直接安装了pycharm,python解释器找不到了,而且没有配置到环境变量中,即windows终端输入python无法找到,无奈之下只能重新安装配置python,记录一下,避免再犯错。1.安装pythonPython官网:https://www.python.org/进去直接下就行,注意选择对应位数的系统,而且......
  • python llama 安装
    PythonLlama安装流程概述在本文中,我将指导你如何安装PythonLlama。PythonLlama是一个非常有用的Python软件包,可以帮助你更轻松地开发Python应用程序。下面是整个安装过程的流程图:flowchartTDA[开始]-->B[下载PythonLlama]B-->C[安装依赖]C-->D[安装......
  • Stable Diffusion python 运行异常解决
    StableDiffusionpython运行异常解决引言在使用Python进行程序开发时,我们可能会遇到程序运行异常的情况。本文将围绕StableDiffusion算法的Python实现,介绍一些常见的运行异常以及解决方法。StableDiffusion算法简介StableDiffusion算法是一种用于图像处理和计算机视觉领域......