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 时,应确保数据的来源是可信的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何快速增加外链?

要快速增加外链并不难,相信各位都知道,难的是快速增加外链且没有风险,所以这时候GNB外链的重要性就出现了,这是一种自然的外链,何谓自然的外链,在谷歌的体系当中,自然外链指的就是其他网站资源给…

mysql 、oss 结合使用

以下是一个使用 Express、MySQL、OSS 和 axios 的 Node.js 示例。这个示例创建了一个 Express 服务器,该服务器有一个路由用于处理视频上传的请求。视频文件首先被上传到 OSS,然后视频的 OSS URL 被存储到 MySQL 数据库。 首先,我们需要安装必…

最大负载1kg!高度模块化设计!大象机器人智能遥控操作机械臂组合myArm MC

引入 近年来,市面上涌现了许多类似于斯坦福大学的 Alopha 机器人项目,这些项目主要通过模仿人类的运动轨迹来进行学习,实现了仿人类的人工智能。Alopha 机器人通过先进的算法和传感技术,能够精确复制人类的动作,并从中…

【stm32】——使用HAL库点灯

目录 一、安装STM32CubeMX 二、HAL库点亮LED灯 1.STM32CubeMX创建项目 2.进入Keil编写代码 三、采用中断控制LED灯的亮灭 1.创建项目 2.Keil中编写代码 四、Keil波形分析 总结 一、安装STM32CubeMX 具体操作可以参考下面链接: 搭建STM32开发环境——STM32CubeMX&a…

用Python pynput库捕捉每一次组合键的优雅舞步

哈喽,大家好,我是木头左! 一、初识pynput:键盘与鼠标的监控利器 当谈论计算机交互时,键盘和鼠标无疑是最常用的设备。无论是编写代码、浏览网页还是玩游戏,都依赖于这些输入设备与机器沟通。但在一些特殊的…

蓝桥杯单片机-国赛5——各外设时序记忆方法及手册重点提取

蓝桥杯涉及三个通讯外设,时序很难记忆,因此本文重点在于记录如何不背时序,直接看手册 注意:本文参考2024年第15届比赛手册讲解,没有英文基础也没关系 每一个外设会在第一张时序图中详细讲解,后续简写&…

【DevOps】深入理解 Nginx Location 块:配置示例与应用场景详解

目录 一、location 块的基本概念 二、location 块的语法 三、location 块的匹配方式 四、location 块的优先级 五、location 块的应用场景 六、location 块的嵌套 七、location 块的指令 八、示例配置 Nginx 是一个高性能的 Web 服务器和反向代理服务器,它广…

网站工作原理

web发展史 1.0时代不可修改 2.0可修改,比如发微博 有以下问题: 课程2: 静态页面 html 动态页面 php 经过服务端的语言解释器,解析成html文件,剩下的就和静态流程一样 后面三个是web服务器,语言解释器&…

边缘人工智能中的视频目标检测方法详解

随着边缘计算和人工智能技术的发展,视频目标检测在边缘设备上的应用变得越来越普遍。这些应用包括智能监控、自动驾驶、无人机巡检等。为了在资源受限的边缘设备上实现高效的目标检测,选择合适的算法和工具至关重要。本文将详细介绍几种适用于边缘设备的…

算法刷题day53:树形DP

目录 引言一、没有上司的舞会二、树的重心三、树的最长路径四、树的中心五、数字转换 引言 关于这个树形 D P DP DP 啊,其实感觉就是对树进行 D F S DFS DFS 只不过有一个返回值罢了,这个返回值一般代表的就是以该结点为根的子树的一个属性&#xff0…

[Spring Boot]baomidou 多数据源

文章目录 简述本文涉及代码已开源 项目配置pom引入baomidouyml增加dynamic配置启动类增加注解配置结束 业务调用注解DS()TransactionalDSTransactional自定义数据源注解MySQL2 测试调用查询接口单数据源事务测试多数据源事务如果依然使用Transactional会怎样?测试正…

dubbo复习: (6)和springboot集成时的条件路由

根据指定的条件,对不满足条件的请求进行拦截。 比如拦截ip地址为192.168.31.227的请求。只需要在dubbo admin中的条件路由菜单创建相应的规则 enabled: true force: true runtime: true conditions:- host ! 192.168.31.227

vlan综合实验

一,实验拓扑: 二,实验需求: 1、pc1和pc3所在接口为access;属于vlan 2;P可以骄问pcepces不的一段;其中pc2可以访问pc4/pc5/pc6; 2、pc1/pc3与pc2/pc4/pc5/pc6不在同一网段; 3、所有pc通过DHCP获取Ip地址,且pc1/pc3可以…

Golang框架HTTP客户端框架zdpgo_resty发送表单请求

核心代码 这里通过字典传递了一个简单的表单数据。 发送的是POST请求。 resp, err : client.R().SetFormData(map[string]string{"username": "jeeva","password": "mypass",}).Post("http://127.0.0.1:3333/login")fmt.P…

Java NIO库中三个不同的类Files、Path和Paths

Files.Path.Paths 三个类是 Java NIO(New I/O)框架的一部分,用于处理 Java 程序中的文件系统操作。让我们详细介绍一下这三个类:1. java.nio.file.Files 类: - Files 类是 Java NIO 框架的核心部分,提供…

轻松搞定LOGO渲染,用ComfyUI快速生成炫酷效果图!

一、准备工作一键搞定 必备资源:垫图和风格参考图 垫图:提供LOGO的基础参考。 风格参考图:确定LOGO的最终效果风格。 节点信息:一键配置 自定义节点(9):包括ComfyUI_Comfyroll_CustomNodes, …

【安装笔记-20240524-Windows-安装测试 7-Zip】

安装笔记-系列文章目录 安装笔记-20240524-Windows-安装测试 7-Zip 文章目录 安装笔记-系列文章目录安装笔记-20240524-Windows-安装测试 7-Zip 前言一、软件介绍名称:7-Zip主页官方介绍7-Zip 主要特征 二、安装步骤测试版本:24.05 (2024-05-14) for Wi…

burpsuite抓包响应报文乱码

1、响应报文中的中文信息乱码 2、解决办法 3、设置成功后重新发起请求

数据可视化-汇总

九大数据分析方法-综合型分析方法以及如何使用这九大分析方法 九大数据分析方法-单指标分析方法与多指标分析方法 数据分析方法与模型 电商数据分析:只会环比下降3%的数据分析师还有救吗? 数据可视化第二版-拓展-和鲸网约车分析一等奖作品 Echarts5…