python3序列化模块之pickle

2024-05-24 10:04

本文主要是介绍python3序列化模块之pickle,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

官方文档

简介

pickle 是 Python 中用于对象序列化和反序列化的标准库模块。它可以将 Python 对象转换为字节流,并将其保存到文件或通过网络传输,在需要时再将其恢复为原来的 Python 对象。

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

常见用法

保存和加载 Python 对象

保存和加载 Python 函数
def my_function(x):return x * 2with open('function.pkl', 'wb') as f:pickle.dump(my_function, f)with open('function.pkl', 'rb') as f:loaded_function = pickle.load(f)
print(loaded_function(5))  # 输出 10
保存和加载 Python 模块

import my_module
with open('module.pkl', 'wb') as f:pickle.dump(my_module, f)with open('module.pkl', 'rb') as f:loaded_module = pickle.load(f)
print(loaded_module.my_function(5))  # 假设 my_module 有一个 my_function 函数

序列化和反序列化

将对象序列化为字节串:
import pickledata = {'a': 1, 'b': 2, 'c': 3}
serialized_data = pickle.dumps(data)
print(serialized_data)  # 输出字节串
从字节串反序列化为对象:
loaded_data = pickle.loads(serialized_data)
print(loaded_data)  # 输出 {'a': 1, 'b': 2, 'c': 3}

处理复杂对象

pickle 可以序列化大多数 Python 对象,包括自定义类的实例:

class Person:def __init__(self, name, age):self.name = nameself.age = ageperson = Person('Alice', 30)
with open('person.pkl', 'wb') as f:pickle.dump(person, f)with open('person.pkl', 'rb') as f:loaded_person = pickle.load(f)
print(loaded_person.name, loaded_person.age)  # 输出 Alice 30

增强安全性

由于 pickle 反序列化可能存在安全隐患,可以使用 pickle.Unpickler 类来增强安全性:

import pickle
from io import BytesIOclass CustomUnpickler(pickle.Unpickler):def find_class(self, module, name):# 只允许反序列化指定的类if module == 'builtins' and name in ['dict', 'list', 'tuple']:return super().find_class(module, name)raise pickle.UnpicklingError(f"Refused to unpickle class: {module}.{name}")data = b'...'  # 从不可信来源获取的序列化数据
bio = BytesIO(data)
unpickler = CustomUnpickler(bio)
try:unpickler.load()
except pickle.UnpicklingError as e:print(f"Error: {e}")

通过网络传输 Python 对象

可以将序列化后的对象通过网络传输,在接收端再反序列化为原对象。这在分布式系统中很有用。

保存复杂的 Python 对象

pickle 可以序列化大多数 Python 对象,包括类实例、函数、模块等。这使得它能够保存和恢复复杂的 Python 数据结构。

实现对象持久化

通过 pickle 可以将 Python 对象保存到文件中,实现对象的持久化存储。这在需要保存程序状态或缓存数据的场景下很有用。

总结

需要注意的是,pickle 模块并不安全,不建议用于处理不可信的数据。因为反序列化的过程可能会执行任意的 Python 代码,存在安全隐患。在使用 pickle 时,应确保数据的来源是可信的。

这篇关于python3序列化模块之pickle的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/998097

相关文章

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

python3 gunicorn配置文件的用法解读

《python3gunicorn配置文件的用法解读》:本文主要介绍python3gunicorn配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python3 gunicorn配置文件配置文件服务启动、重启、关闭启动重启关闭总结python3 gun

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

如何配置Spring Boot中的Jackson序列化

《如何配置SpringBoot中的Jackson序列化》在开发基于SpringBoot的应用程序时,Jackson是默认的JSON序列化和反序列化工具,本文将详细介绍如何在SpringBoot中配置... 目录配置Spring Boot中的Jackson序列化1. 为什么需要自定义Jackson配置?2.