Python pickle模块实现Python对象持久化存储

青禾
青禾
发布时间:2026-10-15| 5人浏览过
原创

本文详细介绍Python标准库pickle模块的使用方法,涵盖dumps、loads、dump和load四个核心函数的语法与参数。通过具体代码示例,演示如何将Python对象序列化为二进制数据并存储至文件或内存,实现对象的持久化与恢复。同时指出pickle在并发和高性能场景下的局限性,并推荐ZODB作为替代方案。

前言:

在Python中,存在一种称为pickle的序列化机制,它能够完成任意Python对象与文本或二进制数据之间的相互转换。这意味着利用pickle,我们可以实现Python对象的持久化存储以及后续的状态恢复。

需要注意的是,pickle作为Python语言的标准内置模块,在Python环境安装时已同时包含该库,无需额外安装。只需通过import语句导入即可在程序中直接调用。

pickle模块主要提供了以下四个核心函数供开发者使用:

  • dumps():负责将Python对象序列化为二进制字节串,并返回该结果;
  • loads():接收给定的二进制字节串数据,将其反序列化为原始的Python对象;
  • dump():将Python对象序列化为二进制数据,并直接写入指定的文件对象中;
  • load():读取指定的包含序列化数据的文件,并返回对应的Python对象。

上述四个函数可根据操作对象分为两类:dumps 和loads 主要用于实现内存中Python对象与二进制字节串之间的相互转换;而dump和load则专注于基于文件系统的Python对象持久化存储与读取。

pickle.dumps()函数

该函数用于将Python对象转换为二进制字节串,其基本语法格式如下:

dumps(obj, protocol=None, *, fix_imports=True)

在此语法格式中,各参数的具体含义解释如下:

  • obj:指定需要被序列化的Python对象;
  • protocol:指定pickle使用的协议版本,可选值为0、1、2、3、4。其中0、1、2适用于Python早期版本,而3和4适用于Python 3.x及更高版本。若未显式指定,默认值为3。
  • 其他参数:这些参数主要是为了兼容Python 2.x版本而保留的,在Python 3.x环境中通常可以忽略。

【例 1】

import pickle
tup1 = ('I love Python', {1,2,3}, None)
#使用 dumps() 函数将 tup1 转成 p1
p1 = pickle.dumps(tup1)
print(p1)

运行该代码后的输出结果为:

b'\x80\x03X\r\x00\x00\x00I love Pythonq\x00cbuiltins\nset\nq\x01]q\x02(K\x01K\x02K\x03e\x85q\x03Rq\x04N\x87q\x05.'

pickle.loads()函数

该函数用于将二进制字节串反序列化为Python对象,其基本语法格式如下:

loads(data, *, fix_imports=True, encoding='ASCII', errors='strict')

其中,data参数代表待转换的二进制字节串。其余参数仅用于兼容Python 2.x版本,在实际使用中通常可以忽略。

【例 2】基于例1生成的二进制数据p1,演示如何将其反序列化为原始Python对象。

import pickle
tup1 = ('I love Python', {1,2,3}, None)
p1 = pickle.dumps(tup1)
#使用 loads() 函数将 p1 转成 Python 对象
t2 = pickle.loads(p1)
print(t2)

程序运行后的结果为:

('I love Python', {1, 2, 3}, None)

特别注意:在使用loads()函数进行反序列化时,系统会自动识别并应用创建该二进制数据时所使用的协议版本,因此无需手动传入协议参数。此外,如果待处理的二进制数据中包含超出原始Python对象定义范围的多余字节,这些多余部分将被自动忽略。

pickle.dump()函数

该函数用于将Python对象序列化后直接写入二进制文件,其基本语法格式为:

dump (obj, file,protocol=None, *, fix mports=True)

各参数的具体含义说明如下:

  • obj:指定需要被序列化的Python对象;
  • file:指定目标文件对象,打开该文件时必须使用"wb"(二进制写入)模式;
  • protocol:其含义与dumps()函数中的protocol参数完全一致,此处不再赘述;
  • 其他参数:为兼容早期Python 2.x版本而保留,当前版本可忽略。

【例 3】演示如何将元组tup1转换为二进制文件对象。

import pickle
tup1 = ('I love Python', {1,2,3}, None)
#使用 dumps() 函数将 tup1 转成 p1
with open ("a.txt", 'wb') as f: #打开文件
    pickle.dump(tup1, f) #用 dump 函数将 Python 对象转成二进制对象文件

执行该程序后,会在代码文件同级目录下生成名为a.txt的文件。由于文件内容存储的是二进制数据,直接使用文本编辑器打开会显示为乱码。

pickle.load()函数

该函数与dump()函数相对应,专门用于将包含序列化数据的二进制文件读取并转换为Python对象。其基本语法格式为:

load(file, *, fix_imports=True, encoding='ASCII', errors='strict')

其中,file参数指定待读取的二进制文件对象,打开时必须使用"rb"(二进制读取)模式。其余参数仅用于兼容Python 2.x版本,可忽略。

【例 4】演示如何将例3中生成的a.txt二进制文件重新转换回Python对象。

import pickle
tup1 = ('I love Python', {1,2,3}, None)
#使用 dumps() 函数将 tup1 转成 p1
with open ("a.txt", 'wb') as f: #打开文件
    pickle.dump(tup1, f) #用 dump 函数将 Python 对象转成二进制对象文件
with open ("a.txt", 'rb') as f: #打开文件
    t3 = pickle.load(f) #将二进制文件对象转换成 Python 对象
    print(t3)

程序运行后的结果为:

('I love Python', {1, 2, 3}, None)

总结:

尽管pickle模块功能强大,但也存在明显的局限性:它不支持对持久化对象的并发访问。在复杂的系统环境中,特别是在处理海量数据读取时,使用pickle可能导致系统I/O性能成为瓶颈。在此类场景下,建议考虑使用ZODB。

ZODB是一个健壮的多用户面向对象数据库系统,专为存储Python对象数据而设计。它能够存储和管理任意复杂的Python对象,并支持事务操作和并发控制。由于ZODB也是基于Python的序列化机制实现的,因此深入掌握pickle是使用ZODB的前提。

至此,关于Python pickle模块实现对象持久化存储的介绍已完成。如需了解更多Python持久化存储相关内容,欢迎查阅本站过往文章或继续浏览后续教程,感谢大家的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。