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: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

Python3 BeautifulSoup爬虫 POJ自动提交

POJ 提交代码采用Base64加密方式 import http.cookiejarimport loggingimport urllib.parseimport urllib.requestimport base64from bs4 import BeautifulSoupfrom submitcode import SubmitCodeclass SubmitPoj():de

Jenkins构建Maven聚合工程,指定构建子模块

一、设置单独编译构建子模块 配置: 1、Root POM指向父pom.xml 2、Goals and options指定构建模块的参数: mvn -pl project1/project1-son -am clean package 单独构建project1-son项目以及它所依赖的其它项目。 说明: mvn clean package -pl 父级模块名/子模块名 -am参数

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

python内置模块datetime.time类详细介绍

​​​​​​​Python的datetime模块是一个强大的日期和时间处理库,它提供了多个类来处理日期和时间。主要包括几个功能类datetime.date、datetime.time、datetime.datetime、datetime.timedelta,datetime.timezone等。 ----------动动小手,非常感谢各位的点赞收藏和关注。----------- 使用datet

C8T6超绝模块--EXTI

C8T6超绝模块–EXTI 大纲 控制流程结构体分析EXTI实现按键 具体案例 控制流程 这里是流程框图,具体可以去看我STM32专栏的EXTI的具体分析 结构体分析 typedef struct {uint32_t EXTI_Line; // 中断/事件线EXTIMode_TypeDef EXTI_Mode; // EXTI 模式EXTITrigger_TypeDef EXTI_

1、创建多模块的maven springboot项目

现在的java的项目都是多模块的,这次也跟个风。 目标:实现下述结构 项目AcedBoot, 子模块:         aced-api 对外提供接口,         aced-web 给前端提供接口,         aced-service 服务层,         aced-dao 数据底层,包含数据库mapper和实体类entity,         aced-commo

Vue2电商项目(二) Home模块的开发;(还需要补充js节流和防抖的回顾链接)

文章目录 一、Home模块拆分1. 三级联动组件TypeNav2. 其余组件 二、发送请求的准备工作1. axios的二次封装2. 统一管理接口API----跨域3. nprogress进度条 三、 vuex模块开发四、TypeNav三级联动组件开发1. 动态展示三级联动数据2. 三级联动 动态背景(1)、方式一:CSS样式(2)、方式二:JS 3. 控制二三级数据隐藏与显示--绑定styl

PrestaShop免费模块/插件/扩展/工具下载

PrestaShop免费模块/插件/扩展/工具下载 PrestaShop免费模块 适用于您的电子商务网站的PrestaShop模块 现有超过3,000个PrestaShop模块可帮助您自定义在线商店,增加流量,提高转化率并建立客户忠诚度。 使您的电子商务网站成功! 下载(超过142+之多的PrestaShop官网认证的免费模块) 标签PrestaShop免费, PrestaShop免费工