模块 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 二进制序列化和反序列化 - 数据持久化的更多相关文章

  1. python类库32[序列化和反序列化之pickle]

      一 pickle pickle模块用来实现python对象的序列化和反序列化.通常地pickle将python对象序列化为二进制流或文件.   python对象与文件之间的序列化和反序列化: pi ...

  2. json —— pickle 的序列化和反序列化

    前言json的序列化和反序列化 1, json 只能序列化简单的数据类型,如,列表,字典,字符串,等简单的类型,不能序列化复杂的类型. 2, json 是支持所有的语言的,多以我们跨语言的时候都是用j ...

  3. Python库:序列化和反序列化模块pickle介绍

    1 前言 在“通过简单示例来理解什么是机器学习”这篇文章里提到了pickle库的使用,本文来做进一步的阐述. 通过简单示例来理解什么是机器学习 pickle是python语言的一个标准模块,安装pyt ...

  4. Python开发之序列化与反序列化:pickle、json模块使用详解

    1 引言 在日常开发中,所有的对象都是存储在内存当中,尤其是像python这样的坚持一切接对象的高级程序设计语言,一旦关机,在写在内存中的数据都将不复存在.另一方面,存储在内存够中的对象由于编程语言. ...

  5. 模块讲解----pickle模块(只在python用的序列化与反序列化)

    特点 1.只能在python中使用,只支持python的基本数据类型. 2.可以处理复杂的序列化语法.(例如自定义的类的方法,游戏的存档等) 3.序列化的时候,只是序列化了整个序列对象,而不是内存地址 ...

  6. python marshal 对象序列化和反序列化

    有时候,要把内存中的一个对象持久化保存到磁盘上,或者序列化成二进制流通过网络发送到远程主机上.Python中有很多模块提供了序列化与反序列化的功能,如:marshal, pickle, cPickle ...

  7. 前后端分离djangorestframework——序列化与反序列化数据

    我们写好后端的代码,要把数据交给前端的展示的,这个数据以什么类型给前端呢?学到这里,我们已经知道这个数据最好是json字符串才行,因为网络间的传输,只认字符串或者二进制,字符串就是我们的数据,二进制就 ...

  8. python接口测试之序列化与反序列化(四)

    在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式 字符串解码为python数据对象.在python的标准库中,专门提供了jso ...

  9. python中的序列化和反序列化

    ~~~~~~滴滴,,什么是序列呢?可以理解为序列就是字符串.序列化的应用 写文件(数据传输) 网络传输 序列化和反序列化的概念   序列化模块:将原本的字典.列表等内容转换成一个字符串的过程就叫做序列 ...

  10. Python实现JSON序列化和反序列化

    在我的应用中,序列化就是把类转成符合JSON格式的字符串,反序列化就是把JSON格式的字符串转换成类.C#的话直接用Newtonsoft.JSON就可以了,非常好用.本来以为python也会有类似的库 ...

随机推荐

  1. 「保姆级」网络爬虫教程(二):教你下载文库中的PDF文档!

    如何点赞再看,养成习惯.微信公众号搜索「Job Yan」关注这个爱发技术干货的 Coder.本文 GitHub https://github.com/JobYan/PythonPearls 已收录,还 ...

  2. 8.3随记之Ubuntu 系统中修改 DNS 的两种办法和暗链

    8.3 随记 在 Ubuntu 系统中修改 DNS 的两种办法 在终端进行修改编辑 sudo nano /etc/resolv.conf 进行修改文件 例如:nameserver 8.8.8.8, 保 ...

  3. Kafka 集群如何实现数据同步?

    哈喽大家好,我是咸鱼 最近这段时间比较忙,将近一周没更新文章,再不更新我那为数不多的粉丝量就要库库往下掉了 T﹏T 刚好最近在学 Kafka,于是决定写篇跟 Kafka 相关的文章(文中有不对的地方欢 ...

  4. 等保测评之主机测评——Centos7

    目录 基础信息收集 (一)身份鉴别 (二)访问控制 (三)安全审计 (四)入侵防范 (五)恶意代码防范 (六)可信验证 (七)数据完整性 (八)数据保密性 (九)数据备份恢复 (十)剩余信息保护 命令 ...

  5. Mysql报:error while loading shared libraries libtinfo.so.5的解决办法

    版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin #.今天闲来无事,想在Anolis8的系统上装一个MySQL8.0玩.前期在安装和配置的过程中没有什么问题,但是在我想 ...

  6. [AI]探寻高等生命的多面驱动

    引子 意识从来是一个前沿课题,充满了学术大神,也充满了神棍.对于意识的讨论和研究需要保持开放的思想,也要遵守理性的严格的方法.我们不是着急去推翻什么或者声称发现了什么,我们大部分要做的事情是把实验多重 ...

  7. typora写作

    平时写博客,一般采用typora,但是字体颜色和上传到博客园的图片大小和居中问题,总是很糟糕,偶然发现输入法里面还有自定义的短语,能够解决这个问题. <p><img src=&quo ...

  8. [THUPC 2023 初赛] 快速 LCM 变换

    题目描述 小 I 今天学习了快速最小公倍数变换(Fast Least-Common-Multiple Transform, FLT),于是他想考考你. 给定一个长度为 \(n\) 的正整数序列 \(r ...

  9. C++ Qt开发:CheckBox多选框组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍CheckBo ...

  10. 阿里云AnalyticDB基于Flink CDC+Hudi实现多表全增量入湖实践

    湖仓一体(LakeHouse)是大数据领域的重要发展方向,提供了流批一体和湖仓结合的新场景.阿里云AnalyticDB for MySQL基于 Apache Hudi 构建了新一代的湖仓平台,提供日志 ...