【python】 用来将对象持久化的 pickle 模块

news2024/11/30 0:49:30

pickle 模块可以对一个 Python 对象的二进制进行序列化和反序列化。说白了,就是它能够实现任意对象与二进制直接的相互转化,也可以实现对象与文本之间的相互转化。

比如,我程序里有一个 python 对象,我想把它存到磁盘里,于是我用 pickle 把他转到一个文本里。当后面我想使用的时候,读取出来时候依然是一个 python 对象。

一、pickle 模块下的方法

pickle 模块提供了以下 4 种方法:

  • dump():将 Python 中的对象序列化成二进制对象,并写入文件
  • load():读取指定的序列化数据文件,并返回对象
  • dumps():将 Python 中的对象序列化成二进制对象,并直接返回,而不是将其写入到文件
  • loads():读取给定的二进制对象数据,并将其转换为 Python 对象

1. dumps()

将 Python 中的对象序列化成二进制对象,并直接返回。

示例

import pickle

test_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 pickle

test_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 pickle

test_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 pickle

test_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 对象 p3
    p3 = 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 数据,造成解封时执行了恶意代码,所以要慎用。

 

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

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

相关文章

有什么好用的电容笔?好用的苹果平替笔

目前市面上的电容笔品类众多&#xff0c;面对琳琅满目的电容笔&#xff0c;很多人一时之间无从下手&#xff0c;不知道口碑比较好的电容笔是什么牌子&#xff0c;因此小编根据电容笔热卖榜&#xff0c;给大家整理了一期电容笔测评&#xff0c;希望能给大家选购电容笔带来帮助和…

3DVR全景技术引领乡村发展新时代!

导语&#xff1a; 在当代社会&#xff0c;科技的迅猛发展与数字化的浪潮已经深入到各个行业&#xff0c;带来了许多新的机遇与挑战。 数字乡村的概念逐渐引起人们的关注与热议。数字乡村作为现代化与传统农业的结合产物&#xff0c;以数字技术和虚拟现实&#xff08;VR&#…

格灵深瞳发布“深瞳阿瞳目”,体育课离AI越来越近

向上探索更普适的大语言模型&#xff0c;向下寻找更具体的应用场景&#xff0c;AI厂商正在这两条路上狂奔。 在众多应用场景中&#xff0c;教育是AI最重要的应用方向之一。中国有2.91亿在校学生、1844.37万专任教师、2800万台校园终端设备&#xff0c;庞大的用户体量汇聚了海量…

聊一聊关于视频缩略图缓存策略

作者&#xff1a;一只修仙的猿 最近回归android业务开发&#xff0c;开发了如下图的视频剪辑时间轴&#xff08;图源&#xff1a;剪映&#xff09;&#xff1a; 对于时间轴上的缩略图&#xff0c;需要去解码器加载获取。若每次都去解码器获取&#xff0c;会导致缩略图加载卡顿&…

webpack处理图片资源(jpeg,jpg,png等)

在webpack5以前&#xff0c;我们处理图片资源通过 file-loader 和 url-loader 进行处理 现在 Webpack5 已经将两个 Loader 功能内置到 Webpack 里了&#xff0c;我们只需要简单配置即可处理图片资源 webpack.config.js配置 {test: /\.(png|jpe?g|gif|webp)$/,type: "as…

Kubernetes高级存储

Kubernetes高级存储 PV PVC k8s支持的存储系统很多&#xff0c;全部掌握不现实。为了屏蔽底层存储实现的细节&#xff0c;方便用户使用&#xff0c;k8s引入PV和PVC两种资源对象。 PV(Persistent Volume)持久化卷&#xff0c;对底层共享存储的抽象&#xff0c;一般由k8s管理员进…

如何通过Shopee大数据选品,在3分钟选出热销爆款!

近年来&#xff0c;随着互联网技术的不断发展&#xff0c;人工智能和大数据成为越来越多人们熟知的概念。通过大数据分析进行选品&#xff0c;能够快速精准地预判各行业类目的变化趋势&#xff0c;帮助我们有效地优化选品、做出正确的销售决策。 大数据选品是指通过Shopee多品类…

Linux——进程地址空间

目录 1、程序地址空间 1.1 研究背景 1.2 程序地址空间 1.3 空间布局图代码测试 1.4 用户空间及内核空间 1.5 Linux及windows对比 1.6 分析Linux下虚拟地址及物理地址 2、进程地址空间 2.1 地址空间概念 2.2 地址空间及页表映射分析 2.3 写时拷贝及虚拟地址再次分析 …

【Flowable】Flowable网关

网关用来控制流程的流向 1.排他网关 排他网关&#xff08;exclusive gateway&#xff09;&#xff08;也叫异或网关 XOR gateway&#xff0c;或者更专业的&#xff0c;基于数据的排他网关 exclusive data-based gateway&#xff09;&#xff0c;用于对流程中的决策建模。当执行…

类脑计算讲解

当前&#xff0c;人工智能的发展有两个主要路径&#xff0c;一个是沿计算机科学发展而来的深度学习途径&#xff0c;另一个是沿着模仿人脑发展而来的类脑计算途径。 类脑计算途径 这个方向是以模拟人脑神经网络计算为基础而发展出的一种新型芯片&#xff0c;通过模拟神经元和…

直播商品库功能(互动功能接收端JS-SDK)

功能概述 图&#xff1a;边看边买--效果截图 本模块主要处理商品库相关逻辑&#xff0c;如展示商品、商品推送和商品上下架等消息。 初始化及销毁 在实例化该模块并进行使用之前&#xff0c;需要对SDK进行初始化配置&#xff0c;详细见参考文档。 在线文件引入方式 // scri…

【论文阅读】Lora

概述 目的在原有大模型上进行fine tune&#xff0c;训练个性化模型 idea&#xff1a;将pretrained model参数冻住&#xff0c;额外训练一个module进行调整&#xff0c;最终输出是原始输出经过module的输出。 技巧&#xff1a;通过低秩分解大大降低了需要训练参数的数量。矩阵…

简单AES加解密Demo——带你了解AES

1.AES简介 AES的全称是Advanced Encryption Standard&#xff0c;意思是高级加密标准。它的出现主要是为了取代DES加密算法的&#xff0c;因为我们都知道DES算法的密钥长度是56Bit&#xff0c;因此算法的理论安全强度是2的56次方。但二十世纪中后期正是计算机飞速发展的阶段&am…

外包的水太深了,18k的阿里外包不太敢去.....

有挺多测试员曾在BAT、网易这些大厂做过外包&#xff0c;想必大家也是非常关心此类问题&#xff0c;我就想介绍下“什么是外包&#xff1f;”&#xff0c;“外包公司的现状”&#xff0c;就“为什么这么多人鄙视外包测试岗&#xff1f;”、”阿里18K的外包测试岗能去吗&#xf…

phpstudy搭建dvwa(以及搭建dvwa问题解决)

目录 phpstudy 下载 问题解决 启动问题 DVWA 下载 安装 配置 phpstudy 下载 小皮面板(phpstudy) - 让天下没有难配的服务器环境&#xff01; (xp.cn) 问题解决 启动问题 要使用dvwa靶场&#xff0c;Apache和myql都是需要启动的&#xff0c;但是可能会遇到mysql启动不…

三大抽样分布

1.三大抽样分布 本人博客&#xff1a;总体分布、样本分布、抽样分布的区别 每一个样本统计量&#xff08;本质是随机变量&#xff09;都有一个分布 以样本平均数为例&#xff0c;它是总体平均数的一个估计量&#xff0c;如果按照相同的样本容量&#xff0c;相同的抽样方式&am…

LVS负载均衡群集——NAT模式实例

目录 一、集群与分布式1.1 集群的含义1.2 LVS模型1.3 系统性能扩展方式1.4 群集的三种类型1.4.1 负载均衡群集1.4.2 高可用群集1.4.3 高性能运算群集 1.5 LVS 的负载调度算法①轮询&#xff08;Round Robin&#xff09;②加权轮询&#xff08;Weighted Round Robin&#xff09;…

电脑重装系统到一半遇到死机该如何解决

在进行电脑重装系统的过程中&#xff0c;有时会遇到系统卡住不动的情况&#xff0c;让人苦恼不已。本文将为您解析电脑重装系统中途卡住的原因&#xff0c;并提供有效的解决方法&#xff0c;帮助您顺利完成系统重装。 工具/原料&#xff1a; 系统版本&#xff1a;windows10专业…

.Net Core 6 WebApi 项目搭建(二)

书接上文&#xff0c;上文写了个简单的.net core api程序创建流程&#xff0c;今天来写一下简单项目搭建步骤。 一.Autofac反射程序集方式服务注册 我们这里还是使用Autofac容器&#xff0c;具体使用教程可参考文章《.NET Core基础知识-依赖注入&#xff08;Autofac&#xff…

七、进程程序替换

文章目录 一、进程程序替换&#xff08;一&#xff09;概念&#xff08;二&#xff09;为什么程序替换&#xff08;三&#xff09;程序替换的原理&#xff08;四&#xff09;如何进行程序替换1. execl2. 引入进程创建——子进程执行程序替换&#xff0c;会不会影响父进程呢? &…