【python】 用来将对象持久化的 pickle 模块
pickle 模块可以对一个 Python 对象的二进制进行序列化和反序列化。说白了,就是它能够实现任意对象与二进制直接的相互转化,也可以实现对象与文本之间的相互转化。
比如,我程序里有一个 python 对象,我想把它存到磁盘里,于是我用 pickle 把他转到一个文本里。当后面我想使用的时候,读取出来时候依然是一个 python 对象。
一、pickle 模块下的方法
pickle 模块提供了以下 4 种方法:
- dump():将 Python 中的对象序列化成二进制对象,并写入文件
- load():读取指定的序列化数据文件,并返回对象
- dumps():将 Python 中的对象序列化成二进制对象,并直接返回,而不是将其写入到文件
- loads():读取给定的二进制对象数据,并将其转换为 Python 对象
1. dumps()
将 Python 中的对象序列化成二进制对象,并直接返回。
示例
import pickletest_list = ["pingguo", {1, 2, 3}, None]# 使用 dumps() 函数将 test_list 转成 p1
p1 = pickle.dumps(test_list)print(p1)
print("返回类型:", type(p1))
输出结果:
b'\x80\x03]q\x00(X\x07\x00\x00\x00pingguoq\x01cbuiltins\nset\nq\x02]q\x03(K\x01K\x02K\x03e\x85q\x04Rq\x05Ne.'
返回类型: <class 'bytes'>
2. loads()
读取给定的二进制对象数据,并将其转换为 Python 对象。
示例 在上面的基础上继续:
import pickletest_list = ["pingguo", {1, 2, 3}, None]# 使用 dumps() 函数将 test_list 转成 p1
p1 = pickle.dumps(test_list)print(p1)
print("返回类型:", type(p1))# 使用 loads() 函数将 p1 转成 Python 对象 p2
p2 = pickle.loads(p1)
print(p2)
print("返回类型:", type(p2))
输出结果:
b'\x80\x03]q\x00(X\x07\x00\x00\x00pingguoq\x01cbuiltins\nset\nq\x02]q\x03(K\x01K\x02K\x03e\x85q\x04Rq\x05Ne.'
返回类型: <class 'bytes'>
['pingguo', {1, 2, 3}, None]
返回类型: <class 'list'>
pickle 反序列化后的对象与原对象是等值的副本对象,类似deepcopy。
3. dump()
将 Python 中的对象序列化成二进制对象,并写入文件。
示例
import pickletest_list = ["pingguo", {1, 2, 3}, None]with open("test_pickle.txt", "wb") as f:# 使用 dump() 函数将 test_list 转成 p1,写到txt文本里pickle.dump(test_list, f)
注意这里的写文件是 "wb",以二进制格式打开一个文件只用于写入,否则会报错。
执行成功后,同级目录下生成一个test_pickle.txt文件,因为是二进制内容,直接打开看到的是乱码。

4. load()
读取指定的序列化数据文件,并返回对象。
示例
import pickletest_list = ["pingguo", {1, 2, 3}, None]with open("test_pickle.txt", "wb") as f:# 使用 dump() 函数将 test_list 转成 p1,写到txt文本里pickle.dump(test_list, f)with open("test_pickle.txt", "rb") as f:# 将二进制文件对象转换成 Python 对象 p3p3 = pickle.load(f)print(p3)print("类型:", type(p3))
注意,这里读取文件用rb,也就是以二进制格式打开一个文件用于只读。
执行成功。
['pingguo', {1, 2, 3}, None]
类型: <class 'list'>
二、可以被 pickle 封存/解封的对象
下列类型可以被封存:
- None、True 和 False
- 整数、浮点数、复数
- str、byte、bytearray
- 只包含可封存对象的集合,包括 tuple、list、set 和 dict
- 定义在模块最外层的函数(使用 def 定义,lambda 函数则不可以)
- 定义在模块最外层的内置函数
- 定义在模块最外层的类
- 某些类实例,这些类的 dict 属性值或 getstate() 函数的返回值可以被封存。
三、pickle 与 json 的区别
python 提供的 json 标准库相信大家都熟悉,提供的方法也与 pickle 相似,那么两者有什么区别呢?
- JSON 是一个文本序列化格式,pickle 是一个二进制序列化格式。
- JSON 是我们可以直观阅读的,而 pickle 不行。
- JSON是可互操作的,在Python之外也可以使用,而pickle则是Python专用的。
- 默认情况下,JSON 只能表示 Python 内置类型的子集,不能表示自定义的类;但 pickle 可以表示大量的 Python 数据类型。
- JSON不像 pickle,对一个不信任的JSON进行反序列化的操作本身不会造成任意代码执行漏洞。
关于最后一点,说的是 pickle 模块并不安全。很有可能你去解封的是恶意构建的 pickle 数据,造成解封时执行了恶意代码,所以要慎用。
相关文章:
【python】 用来将对象持久化的 pickle 模块
pickle 模块可以对一个 Python 对象的二进制进行序列化和反序列化。说白了,就是它能够实现任意对象与二进制直接的相互转化,也可以实现对象与文本之间的相互转化。 比如,我程序里有一个 python 对象,我想把它存到磁盘里ÿ…...
【博客654】prometheus配置抓取保护以防止压力过载
prometheus抓取保护配置以防止压力过载 场景 担心您的应用程序指标可能突然激增,以及指标突然激增导致prometheus压力过载 就像生活中的许多事情一样,标签要有节制。当带有用户 ID 或电子邮件地址的标签被添加到指标时,虽然它不太可能结束…...
Backtrader官方中文文档:第十三章Observers观察者
本文档参考backtrader官方文档,是官方文档的完整中文翻译,可作为backtrader中文教程、backtrader中文参考手册、backtrader中文开发手册、backtrader入门资料使用。 本章包含 backtrader 官方Observers章节全部内容,入口 : https://backtrader.com/docu/observers-and-sta…...
算法leetcode|54. 螺旋矩阵(rust重拳出击)
文章目录 54. 螺旋矩阵:样例 1:样例 2:提示: 分析:题解:rust:go:c:python:java:每次循环移动一步:每次循环完成一个顺时针:…...
单容水箱建模(自衡单容水箱+无自衡单容水箱)
自衡单容水箱Simulink建模和PLC源代码请参看下面文章链接: 单容双容水箱建模(simulink仿真+PLC代码)_RXXW_Dor的博客-CSDN博客PLC通过伯努利方程近似计算水箱流量详细内容请参看下面的文章博客PLC通过伯努利方程近似计算水箱流量(FC)_怎么用伯努利方程求某水位流量_RXXW_Dor的…...
分享Python7个爬虫小案例(附源码)
本次的7个python爬虫小案例涉及到了re正则、xpath、beautiful soup、selenium等知识点,非常适合刚入门python爬虫的小伙伴参考学习。注:若涉及到版权或隐私问题,请及时联系我删除即可。 1.使用正则表达式和文件操作爬取并保存“某吧”某帖子…...
我用ChatGPT写2023高考语文作文(一):全国甲卷
2023年 全国甲卷 适用地区:广西、贵州、四川、西藏 人们因技术发展得以更好地掌控时间,但也有人因此成了时间的仆人。 这句话引发了你怎样的联想与思考?请写一篇文章。 要求:选准角度,确定立意,明确文体&am…...
c++ modbusTCP
//Modbus TCP是一种基于TCP/IP协议的Modbus协议,它允许Modbus协议通过以太网进行通信。 //在C中,可以使用第三方库来实现Modbus TCP通信,例如libmodbus和QModbus。 //使用libmodbus库实现Modbus TCP通信的示例代码如下: //c #incl…...
linux(信号结尾)
目录: 1.可重入函数 2.volatile关键字 3.SIGCHLD信号 -------------------------------------------------------------------------------------------------------------------------------- 1.可重入函数----------用来描述一个函数的特点的 1.在单进程当中也存…...
【漏洞修复】node-exporter被检测出来pprof调试信息泄露漏洞
node-exporter被检测出来pprof调试信息泄露漏洞 说在前面解决方法结语 说在前面 惯例开篇吐槽,有些二五仔习惯搞点自研的安全扫描工具,然后加点DIY元素,他也不管扫的准不准,就要给你报个高中危的漏洞,然后就要去修复&…...
在linux 上安装 NFS服务器软件
在 Ubuntu Linux 中创建 NFS 文件系统通常需要完成以下步骤: 安装 NFS 服务器软件。您可以在终端上使用以下命令来安装所需的软件包。sudo apt-get update sudo apt-get install nfs-kernel-server创建要共享的目录。例如,您可以创建一个名为 /var/nfs/shared 的目录。sudo m…...
网卡中的Ring buffer -- 解决 rx_resource_errors 丢包
1、软硬件环境 硬件: 飞腾E2000Q 平台 软件: linux 4.19.246 2、问题现象 网卡在高速收包的过程中,出现 rx error , 细查是 rx_resource_errors 如下: rootE2000-Ubuntu:~# ifconfig eth1 eth1: flags4163<UP,BROADCAST,RU…...
六月九号补题日记:Codeforces Round 877 (Div. 2)
专注是不够的,很重要的一方面在于细节,关注细节:精细和专注才是成功的重点!!! A 题意:给你一堆数字,说这一堆数字是由最初的两个数字相减得到的,让你求出两个数字其中一…...
python基础选择题,高中适用
1. 下面哪个是 Python 的注释符号? A. // B. # C. /* D. ; 答案:B 2. 下面哪个是 Python 的赋值运算符? A. B. C. ! D. > 答案:A 3. 下面哪个是 Python 的逻辑运算符? A. && B. || C. ! D. & 答…...
Linux 面试题-(腾讯,百度,美团,滴滴)
Linux 面试题-(腾讯,百度,美团,滴滴) 分析日志t.log(访问量),将各个ip 地址截取,并统计出现次数,并按从大到小排序(腾讯) http://192.168.200.10/index1.html http://192.168.200.10/index2.html http://192.168.200.20/index1.html http://192.168.20…...
DDD--战略设计步骤
在领域驱动设计(Domain-Driven Design,DDD)中,战略设计是指在系统的整体层面上考虑领域模型的组织和架构。下面是一些战略设计的详细步骤: 确定限界上下文(Bounded Context):首先&a…...
Web Scoket简述
Web Socket 简介 初次接触 Web Socket 的人,我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 因为 HTTP 协议有一个缺陷:通信只能由客户端发起。http基于请求响应实现。 (准确来说HTTP…...
“Docker 技术在企业中的应用及挑战解决方案“
Docker 技术是一种基于容器化的应用部署和管理技术。随着云计算的普及和应用的不断增多,Docker 技术在企业中的应用越来越广泛。本文将介绍 Docker 技术的基本概念、优势和应用场景,并讨论如何在企业中应用 Docker 技术。 一、Docker 技术概述 Docker …...
vue中开发包、生产包、全局包的区别以及安装语法
目录 开发包 (devDependencies) 安装方法 生产包 (dependencies) 安装方法 全局包 (Global build) 安装方法 vue中有三种不同类型的包:开发包 (Development build),生产包 (Production build) 和全局包 (Global build)。下面我们分别解释它们的区别…...
list的模拟实现
前言 list是STL中重要的容器,了解它的原理对于我们掌握它是有很多的帮助的,一般list和vector都是一起来使用的,因为它们的优缺点不同,刚好可以互补。list的优点是任意位置的插入和删除都很快,它的缺点是不支持随机访问…...
AI编程入门指南:从提示词工程到实战工具配置
1. 项目概述:从“AI编程101”看个人开源项目的价值与路径最近在GitHub上看到一个挺有意思的项目,叫“ai-coding-101”,作者是jnMetaCode。光看这个标题,你大概就能猜到它的方向——一个面向AI辅助编程的入门指南。这类项目现在挺多…...
Visual Studio AI助手深度集成:提升.NET开发效率的实战指南
1. 项目概述:当AI助手住进你的IDE 如果你是一名.NET开发者,每天大部分时间都在Visual Studio里度过,那你一定经历过这样的时刻:盯着一段复杂的业务逻辑,思考如何重构;或者为一个方法编写单元测试ÿ…...
Dify工作流设计实战:从模式解析到生产部署的Awesome资源指南
1. 项目概述:一个为Dify工作流而生的“Awesome”资源集合如果你正在使用Dify.AI来构建你的AI应用,并且已经深入到工作流这个强大但略显复杂的模块,那么你很可能和我一样,经历过一段“摸着石头过河”的时期。Dify的官方文档固然详尽…...
AI编程代理全景导航:从技术选型到实战评估指南
1. 项目概述:一个探索智能编码代理的“藏宝图”最近在GitHub上闲逛,发现了一个挺有意思的项目,叫tndata/CodingAgentExplorer。光看名字,你可能会觉得这又是一个关于AI代码生成或者大语言模型(LLM)的常规仓…...
系统设计:一致性哈希
原文:towardsdatascience.com/system-design-consistent-hashing-43ddf48d2d32 https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/25fd590876caa1d6c711fa521ea11f98.png 简介 我们生活在一个每天都会大量生成数据的世界上。在…...
【SITS大会技术社区交流活动深度复盘】:20年一线专家亲述3大未公开的破圈协作模型与落地工具包
更多请点击: https://intelliparadigm.com 第一章:【SITS大会技术社区交流活动深度复盘】:20年一线专家亲述3大未公开的破圈协作模型与落地工具包 模型一:异构角色动态配对机制 传统技术沙龙常陷入“讲师单向输出、听众被动接收…...
从零搭建AI-ready数据管道:2026奇点大会现场复刻的3小时极速部署流水线(含LLM元数据自动标注模块)
更多请点击: https://intelliparadigm.com 第一章:AI原生数据管道搭建:2026奇点智能技术大会数据工程实践 在2026奇点智能技术大会上,核心数据平台团队首次全栈落地了真正意义上的AI原生数据管道(AI-Native Data Pipe…...
海思Hi3516 GPIO复用避坑指南:从Excel引脚复用表到实际配置的完整解析
海思Hi3516 GPIO复用配置实战:从寄存器解析到避坑全攻略 当你在调试Hi3516开发板时,是否遇到过这样的场景:明明按照手册配置了GPIO,硬件却毫无反应?或者发现某个复用引脚无法正常工作?这些问题往往源于对海…...
RPGMZ 万能通用钩子代码 插入自己的代码逻辑
const prevUpdate SceneManager._scene.update; SceneManager._scene.update function() {prevUpdate.call(this); // 保留原版// 你的任意代码SceneManager._scene.update prevUpdate; // 用完归还 };例子1 消息框对话 如何插入自己的对话内容const prevUpdate SceneMan…...
Noto字体库:构建全球化数字产品的字体基石
Noto字体库:构建全球化数字产品的字体基石 【免费下载链接】noto-fonts Noto fonts, except for CJK and emoji 项目地址: https://gitcode.com/gh_mirrors/no/noto-fonts 在全球化的数字时代,字体选择已不再是简单的美学决策,而是直…...
