Python中使用Pickle来保存对象和重载对象

详解python pickle中的反序列化漏洞 反序列化过程有漏洞:如果我们反序列化了一个不可信的数据源,那就可能引发反序列化攻击。攻击者可以在序列化的数据里嵌入恶意代码,当你反序列化这个数据时,这些恶意代码就会被执行,可能会导致数据泄露、系统崩溃,甚至让攻击者远程控制你的系统。Pickle模块是Python自带的,它主要用来序列化和反序列化Python对象。你可以用Pickle把任何Python对象(包括复杂的数据结构)保存成字节流,然后在需要的时候再加载回来。Pickle的工作原理Pickle的工作原理其实很简单。 阅读详情

拾取和解除拾取

对象的序列化是将对象转换为比特形式的方法,这样我们就可以在硬盘上保存对象的状态。尽管许多语言都为我们提供了对象序列化的方式,但Python在所有的语言中更加灵活。

在Python中,对象序列化被称为pickling,而去序列化被称为unpickling。我们在 Python 中大多使用对象。因此,我们几乎可以对所有的东西进行序列化/非序列化。然而,在使用它之前,不可避免地要小心,必须知道 pickling 的目的。

在进入理论细节之前,让我们用Pickle模块演示一下Python中的pickling。

在Python中进行腌制

对于pickling,首先,导入pickle 模块。

import pickle

我们可以在Python中序列化几乎任何对象。让我们拿一个字典对象来做示范。

bio_dict = {
    'name': 'Zohaib',
    'age': 29,
    'profession': 'Engineer'
}#Python小白学习交流群:711312441

pickle 包含 函数来序列化该对象。.dump()

with open('bio_dict.pickle', 'wb' ) as file_name:
    pickle.dump(bio_dict, file_name)

在上面的代码中,我们打开了一个有写权限的文件bio_dict.pickle (即wb),然后用.dump() 函数将bio_dict 字典腌制到腌制文件中。结果,我们成功地将字典转换为字节流格式。

在 Python 中解除腌制

当需要再次使用腌制的对象时,可以对它进行反序列化。为此,我们可以使用pickle.load() 函数,正如下面的代码所演示的:

with open('bio_dict.pickle', 'rb' ) as file_name:
    unpickled_dict =pickle.load(file_name)
print("The retrieved dictionary is: ", unpickled_dict)

我们打开之前保存的(.pickle)文件,然后使用.load() 函数再次获取对象。上面的代码产生了以下输出。

The retrieved dictionary is:  {'name': 'Zohaib', 'age': 29, 'profession': 'Engineer'}

我们可以用下面的代码检查腌制和未腌制的对象是否相等。

assert bio_dict==unpickled_dict
腌制的优势和劣势

以下是Python中腌制的优点:

  • 几乎任何Python对象都可以用Python中的这个pickle 模块进行序列化,不像JSON 和其他序列化技术。

  • 我们以后可以使用腌制的对象。例如,如果你做了一个大型的计算,并且腌制了对象。那么,下次当你开始一个新的Python会话时,你不需要再做以前完成的大型计算。

  • 相反,你把腌制的对象解开,在新的计算中使用它们。这样,我们可以节省时间和资源。

  • 腌制的对象可以有效地被多个线程读取,从而实现快速的并行计算。

腌制有多种后果。在使用pickling之前,你应该意识到它们。

  • 我们不应该解开从不可靠的来源收集的数据。它可能包含被篡改的数据或一些任意脆弱的代码,可能导致严重的安全问题。
  • 与JSON 文件不同,腌制文件不是人类可以阅读的。
  • JSON 文件可以被多种语言所使用和支持。另一方面,Python中的pickle文件可能不被许多语言所支持,你可能需要相关的第三方中介库来作为适配器。

还有什么可以被腌制

这是一个重要的问题,需要很多时间来描述。但是,简而言之,你可以腌制许多Python的东西,比如函数、Pandas 数据框,以及其他许多东西。

Pickle也是一个对机器学习非常有帮助的工具,因为它可以让你保存你的模型,减少耗时的再训练,以及分享、提交和重新加载以前训练的模型。

你可以按照这个指南使用pickle来存储你的机器学习模型。

三道命令加固Pickle反序列化:防御恶意模型攻击 Pickle反序列化是Python生态中高危但难以替代的模型加载机制,其本质是将字节流还原为任意Python对象,因而天然具备代码执行能力。攻击者常利用GLOBAL、REDUCE等操作码注入os.system或subprocess.Popen调用,实现远程命令执行。防御核心在于协议层限制(禁用危险opcode)、路径层约束(白名单模块加载路径)与内容层审计(静态opcode扫描),三者构成漏斗式纵深防护。该方案不改变模型格式、零运行时性能损耗,适用于scikit-learn、XGBoost、LightGBM 阅读详情

相关推荐

Pickle序列化原理与安全实践:Python对象持久化的正确用法

序列化是将内存对象转换为可存储或传输格式的基础技术,其核心在于重建对象状态而非简单存取数据。Pickle作为Python原生序列化机制,基于指令流协议实现对象快照,具备高效但强语言绑定、版本敏感、存在反序列化执行风险等本质特性。理解__reduce__、协议版本演进及字节码指令机制,有助于规避AttributeError、UnicodeDecodeError等典型故障;而结合joblib、Parquet、Protocol Buffers等替代方案,可在机器学习模型保存、微服务通信、大数据交换等场景中实现安全

weixin_34005090的博客 347

通用!Python保存一个对象的方式

通过如下的代码,可以将Python中的字典保存到一个(二进制)文件中。当然,这个方法是通用的,调用了pickle这个包,能够保存Python中所有的对象。 dictionary_data = {"a": 1, "b": 2} a_file = open("data.pkl", "wb") pickle.dump(dictionary_data, a_file) a_file.close() a_file = open("data.pkl", "rb") output = pickle.load(a_

Python热爱者的博客 2788

Python实现将对象存储到文件

当然,需要注意的是,pickle模块生成的文件是Python特定的二进制格式,如果您希望与其他编程语言交互,可能需要考虑使用其他数据序列化格式,如JSON或Protocol Buffers。在上面的代码中,我们首先定义了一个名为Person的类,它具有name和age两个属性。然后,我们创建一个Person对象,并将其保存在名为person.pickle的文件中。在Python编程中,我们经常需要将对象保存到文件中以便将来使用。这一行中,我们使用了Python的上下文管理器来打开文件。

ByteBuster的博客 494

python 保存实例化对象

类对象保存与读取

qq_43694176的博客 670

【Get深一度】小波分析概念1——紧支撑集是什么意思,通俗解释

最近学到小波,在仿真中也用到了紧支撑函数;紧支撑性越好,说明能量越集中;用最通俗的话来讲,紧支撑是这样的: 对于函数f(x),如果自变量x在 0附近的取值范围内,f(x)能取到 C; 而在此之外,f(x)取值为 0; 那么这个函数f(x)就是紧支

Trey_优快云 的优快云博客 8349

Cadence公司的数字IC设计工具:综合工具(Genus)——(2)

介绍Cadence公司的数字IC设计工具Genus

qq_42922513的博客 1945

Python中的对象储存

栈空间的内存由系统的编译器或解释器自动分配,无需手动干预;堆空间的内存需要由用户来手动的申请和释放。

shenglizaiwo1的博客 641

通讯软件013——分分钟学会Kepware OPC AE Server仿真配置

本文介绍如何使用Kepware软件仿真OPC AE Server配置。

zhouwl72的博客 2229

python保存_Python-保存对象(数据持久性)

小编典典你可以使用pickle标准库中的模块。这是你的示例的基本应用:import pickleclass Company(object):def __init__(self, name, value):self.name = nameself.value = valuewith open('company_data.pkl', 'wb') as output:company1 = Company...

weixin_39753211的博客 601

YOLOv11 改进策略 | HWD:引入 Haar 小波变换,减少信息丢失

在卷积神经网络(CNN)中,下采样(Downsampling)是降低特征图分辨率、扩大感受野的关键操作,通常通过最大池化(MaxPool)或步长为 2 的卷积(Strided Convolution)实现。然而,这些方法在降低分辨率的同时,往往会丢失图像中的高频细节信息(如边缘、纹理)和精确的空间位置信息,这可能对后续特征提取和目标检测精度产生不利影响,尤其是对于小目标和需要精细定位的任务。

走向CTO的路上... 1792

用AG9311芯片DIY一个多功能Type-C扩展坞:从原理图到PCB布局的保姆级指南

本文详细介绍了如何利用AG9311芯片DIY多功能Type-C扩展坞,涵盖从原理图设计到PCB布局的全过程。AG9311芯片作为高性价比的Type-C控制器,支持HDMI 2.0、USB 3.0、PD快充和千兆网口,适合硬件爱好者打造个性化扩展坞。文章还提供了调试技巧和进阶优化建议,帮助读者轻松完成项目。

weixin_42520909的博客 406

python学习手册笔记——27.更多实例

00.模块名使用小写字母开头,而类名使用一个大写字母开头 01.构造函数 02.用Python编程其实就是一种增量原型,编写一些代码,测试它,编写更多的代码,再次测试。 03.添加了结构的一个额外的层级,他们最终还是通过嵌入和处理列表及字符串这样的解百纳核心数据类型来完成其大部分工作 04.封装的思想就是把操作逻辑包装到界面止呕,每种操作在我们的程序里只编码一次。 05.方法只是附加给类...

weixin_30644369的博客 78

从永恒之蓝看内网安全:企业如何用Nmap+MSF快速检测445端口风险

本文探讨了企业如何利用Nmap和Metasploit快速检测445端口风险,防范永恒之蓝(MS17-010)漏洞攻击。通过分阶段检测流程和自动化工具组合,企业可高效识别内网风险主机,并实施紧急隔离与长效防护策略,提升整体网络安全防护能力。

weixin_30772105的博客 601

Python对象序列化和反序列化pickle和marshal

在开展跨机器交互时,常常要在机器之间传递“对象”,而不仅仅是数据,这样我们就需要将Python对象进行序列化和反系列化,前面的json其实提供了一种序列化和反序列化的机制,但仅仅支持Python的简单对象,对于复杂的对象需要自己实现序列化和反序列化编码。Python提供了一种内部格式的序列化和反序列化机制。

862

高通IPA硬件加速介绍

‌ 高通IPA (Internet Protocol Accelerator)模块是一种硬件加速模块,由高通公司(Qualcomm)提供,主要用于优化移动设备上的网络数据传输,特别是通过 LTE 、 5G 等移动网络的数据传输‌‌。IPA模块通过硬件加速,显著提高了数据传输的速度和效率,同时降低了设备的功耗,并提供了更稳定的网络连接,减少了数据传输中的丢包和延迟‌。

四儿家的小祖宗的博客 1626

FAST-LIVO2 源码精读(一):系统总览——从 LIO 到 LIVO 的多传感器融合架构

本文是「FAST-LIVO2 激光-惯性-视觉里程计源码精读」专栏的开篇。全专栏共 18 篇,锚定香港大学 MaRS 实验室 2025 年 1 月开源的官方代码,逐模块剖析这套登上 T-RO’24 的多传感器融合系统。开篇先建立全局认知:FAST-LIVO2 所要解决的问题、整体框架的构成,以及源码主线的数据流动。

PX4-SLAM-PNC 599

python pickle反序列化漏洞

前置知识 什么是pickle pickle是Python专用的一个进行序列化和反序列化的工具包,pickle能表示Python几乎所有的类型(包括自定义类型),由一系列opcode组成,模拟了类似堆栈的内存。 与PHP序列化或者JSON,这些以键值对形式存储序列化对象数据的不同,pickle 序列化(Python独有)是将一个 Python 对象及其所拥有的层次结构变成可以持久化储存的二进制数据,无法像JSON 一样直观阅读。在Python中,采用术语 封存 (pickling)和 解封 (unpickli

weixin_43610673的博客 4016

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Python_序列化_json_pickle

序列”与java中的“流”不知道有什么关系,也不知道是否可以理解为一长串计算机硬件基本单位排列的“长长队伍”,用于存储或是用计算机网络中的数据以各种各样,繁杂但是有结构的协议封装,加密,转发······但是python中为什么要用json模块呢?先不管。

chenhenryjin的博客 184

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Python自动化之pickle和面向对象初级篇

pickle模块扩展 1 pickle之文件操作 示例1 with open("test", 'rb') as f: lines = f.readlines() print(pickle.load(f)) 运行报错: print(pickle.load(f)) EOFError: Ran out of input with open("test", 'rb') as f: ...

weixin_30855761的博客 112

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

python 对象序列化_序列化Python对象的方法

问题你需要将一个Python对象序列化为一个字节流,以便将它保存到一个文件、存储到数据库或者通过网络传输它。解决方案对于序列化最普遍的做法就是使用 pickle 模块。为了将一个对象保存到一个文件中,可以这样做:12345import pickledata= ...# Some Python objectf= open('somefile','wb')pickle.dump(data, f)为了将...

weixin_39867208的博客 222

序列化和反序列化_序列化与反序列化:pickle

本文约2180字,建议阅读时间12~15分钟关键字:python,序列化,反序列化,字节编码,picklepickle模块主要用于将python对象与二进制序列之间的转换,是python所特有的,pickle模块是不安全的,只有当把字节序列转换为python对象时才是可信的,当操作不可信的数据时,建议使用json格式。pickle模块会追踪已经被序列化对象的位置,所以随后对相同对象的引用...

weixin_39732716的博客 449

python class(类)的简介及 shelve的使用

创建一个自定义的类 #!/usr/bin/python #-*-coding:utf-8-*- class person: #初始化类 def __init__(self,name,age,pay=0,job=None): self.name = name self.age = age self.pay = pay ...

Milotic 661

Theano学习笔记(六)——载入与保存、条件

载入与保存 Python标准的保存类别实体并重新载入它们的途径是pickle机制。许多Theano对象可以由此被序列化(或者反序列化),然而pickle的局限性在于,被序列化的类别实例的代码或者数据并没有被同时保存。因此重新载入先前版本的类可能会出问题。 因此,需要寻求基于预期保存和重新载入的耗时的不同机制。 对于短期(比如临时文件和网络转录),Theano的pickle是可行的。 对于长

程引的专栏 8660

Python----类

1 类其实就是由函数和其他变量名所构成的包,很像模块 2 定义一个类的超类是通过在class语句的圆括号中将其列出,类在圆括号中由左至右列出的顺序,会决定其在类树中由左至右的搜索的顺序 3 类通过继承进行定制 超类列在类开头的括号中 类从其超类中继承属性 实例会继承所有可读取类的属性 每个object.attribute都会开启新的独立搜索 逻辑的修改是通过创建子类,而不是修改超类 4 类是模...

qq_37016139的博客 242

Python模块使用指南:从基础到高级技巧

Python模块是代码组织和复用的基本单元,通过将相关功能封装在独立文件中实现工程化开发。其核心原理是基于命名空间管理和文件系统搜索路径机制,支持多种导入方式满足不同场景需求。模块化开发能显著提升代码可维护性,避免命名冲突,并支持团队协作。在实际应用中,标准库模块如os、sys、json等提供了系统操作、数据处理等基础能力,而高级技巧如动态导入、模块缓存优化则能进一步提升开发效率。掌握Python模块机制是构建可扩展应用程序的基础,特别在数据处理和Web开发领域应用广泛。本文通过斐波那契数列等示例,详解模块

weixin_33978044的博客 332
上一篇: Python中解决Python中ModuleNotFoundError: No module named ‘urllib2‘ 的方法
下一篇: Python中使用defaultdict容器的用法
Python热爱者
博客等级 码龄7年 3056粉丝 1330原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值