Python pickle模块:实现Python对象的持久化存储

news2024/11/15 17:57:27

Python 中有个序列化过程叫作 pickle,它能够实现任意对象与文本之间的相互转化,也可以实现任意对象与二进制之间的相互转化。也就是说,pickle 可以实现 Python 对象的存储及恢复。

值得一提的是,pickle 是 python 语言的一个标准模块,安装 python 的同时就已经安装了 pickle 库,因此它不需要再单独安装,使用 import 将其导入到程序中,就可以直接使用。

pickle 模块提供了以下 4 个函数供我们使用:

  1. dumps():将 Python 中的对象序列化成二进制对象,并返回;

  1. loads():读取给定的二进制对象数据,并将其转换为 Python 对象;

  1. dump():将 Python 中的对象序列化成二进制对象,并写入文件;

  1. load():读取指定的序列化数据文件,并返回对象。

以上这 4 个函数可以分成两类,其中 dumps 和 loads 实现基于内存的 Python 对象与二进制互转;dump 和 load 实现基于文件的 Python 对象与二进制互转。

pickle.dumps()函数

此函数用于将 Python 对象转为二进制对象,其语法格式如下:

dumps(obj, protocol=None, *, fix_imports=True)

此格式中各个参数的含义为:

  • obj:要转换的 Python 对象;

  • protocol:pickle 的转码协议,取值为 0、1、2、3、4,其中 0、1、2 对应 Python 早期的版本,3 和 4 则对应 Python 3.x 版本及之后的版本。未指定情况下,默认为 3。

  • 其它参数:为了兼容 Python 2.x 版本而保留的参数,Python 3.x 中可以忽略。

【例 1】

import pickle
tup1 =('I love Python',{1,2,3}, None)
#使用 dumps() 函数将 tup1 转成 p1
p1 = pickle.dumps(tup1)
print(p1)

输出结果为:

b'\x80\x03X\r\x00\x00\x00I love Pythonq\x00cbuiltins\nset\nq\x01]q\x02(K\x01K\x02K\x03e\x85q\x03Rq\x04N\x87q\x05.'

pickle.loads()函数

此函数用于将二进制对象转换成 Python 对象,其基本格式如下:

loads(data, *, fix_imports=True, encoding='ASCII', errors='strict')

其中,data 参数表示要转换的二进制对象,其它参数只是为了兼容 Python 2.x 版本而保留的,可以忽略。

【例 2】在例 1 的基础上,将 p1 对象反序列化为 Python 对象。

import pickle
tup1 =('I love Python',{1,2,3}, None)
p1 = pickle.dumps(tup1)
#使用 loads() 函数将 p1 转成 Python 对象
t2 = pickle.loads(p1)
print(t2)

运行结果为:

('I love Python', {1, 2, 3}, None)

注意,在使用 loads() 函数将二进制对象反序列化成 Python 对象时,会自动识别转码协议,所以不需要将转码协议当作参数传入。并且,当待转换的二进制对象的字节数超过 pickle 的 Python 对象时,多余的字节将被忽略。

pickle.dump()函数

此函数用于将 Python 对象转换成二进制文件,其基本语法格式为:

dump (obj, file,protocol=None, *, fix mports=True)

其中各个参数的具体含义如下:

  • obj:要转换的 Python 对象。

  • file:转换到指定的二进制文件中,要求该文件必须是以"wb"的打开方式进行操作。

  • protocol:和 dumps() 函数中 protocol 参数的含义完全相同,因此这里不再重复描述。

  • 其他参数:为了兼容以前 Python 2.x版本而保留的参数,可以忽略。

【例 3】将 tup1 元组转换成二进制对象文件。

import pickle
tup1 =('I love Python',{1,2,3}, None)
#使用 dumps() 函数将 tup1 转成 p1
with open("a.txt",'wb') as f:#打开文件
    pickle.dump(tup1, f)#用 dump 函数将 Python 对象转成二进制对象文件

运行完此程序后,会在该程序文件同级目录中,生成 a.txt 文件,但由于其内容为二进制数据,因此直接打开会看到乱码。

pickle.load()函数

此函数和 dump() 函数相对应,用于将二进制对象文件转换成 Python 对象。该函数的基本语法格式为:

load(file, *, fix_imports=True, encoding='ASCII', errors='strict')

其中,file 参数表示要转换的二进制对象文件(必须以 "rb" 的打开方式操作文件),其它参数只是为了兼容 Python 2.x 版本而保留的参数,可以忽略。

【例 4】将例 3 转换的 a.txt 二进制文件对象转换为 Python 对象。

import pickle
tup1 =('I love Python',{1,2,3}, None)
#使用 dumps() 函数将 tup1 转成 p1
with open("a.txt",'wb') as f:#打开文件
    pickle.dump(tup1, f)#用 dump 函数将 Python 对象转成二进制对象文件
with open("a.txt",'rb') as f:#打开文件
    t3 = pickle.load(f)#将二进制文件对象转换成 Python 对象
print(t3)

运行结果为:

('I love Python', {1, 2, 3}, None)

总结

看似强大的 pickle 模块,其实也有它的短板,即 pickle 不支持并发地访问持久性对象,在复杂的系统环境下,尤其是读取海量数据时,使用 pickle 会使整个系统的I/O读取性能成为瓶颈。这种情况下,可以使用 ZODB。

ZODB 是一个健壮的、多用户的和面向对象的数据库系统,专门用于存储 Python 语言中的对象数据,它能够存储和管理任意复杂的 Python 对象,并支持事务操作和并发控制。并且,ZODB 也是在 Python 的序列化操作基础之上实现的,因此要想有效地使用 ZODB,必须先学好 pickle。

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

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

相关文章

2023美赛A题:受旱灾影响的植物群落

文章目录背景要求服务词汇表背景 不同的植物对压力有不同的反应。例如,草原对干旱非常敏感。干旱以不同的频率和严重程度发生。大量的观察表明,不同物种的数量对植物群落如何在连续多代干旱周期中适应起到了重要作用。在一些仅有一种植物的群落中&#…

Vue基础13之浏览器本地存储、TodoList本地存储、组件自定义事件

Vue基础13浏览器本地存储localStorage 本地存储sessionStorage 会话存储总结TodoList本地存储App.vue组件自定义事件子组件给父组件传值使用props方法App.vueSchool.vue子组件给父组件传值使用组件自定义事件——绑定第一种写法:使用v-on或App.vueStudent.vue第二种…

idea快捷编码:生成for循环、主函数、判空非空、生成单例方法、输出;自定义快捷表达式

前言 idea可根据输入的简单表达式进行识别,快速生成语句 常用的快捷编码:生成for循环、主函数、判空非空、生成单例方法、输出 自定义快捷表达式 博客地址:芒果橙的个人博客 【http://mangocheng.com】 一、idea默认的快捷表达式查看 Editor…

String对象的创建和比较

String类的概述 String类:代表字符串。 Java 程序中的所有字符串字面值(如 “abc” )都作 为此类的实例实现。 String是JDK中内置的一个类:java.lang.string 。 String表示字符串类型,属于引用数据类型,不…

饲养员喂养动物-课后程序(JAVA基础案例教程-黑马程序员编著-第四章-课后作业)

【案例4-2】饲养员喂养动物 记得 关注,收藏,评论哦,作者将持续更新。。。。 【案例目标】 案例描述 饲养员在给动物喂食时,给不同的动物喂不同的食物,而且在每次喂食时,动物都会发出欢快的叫声。例如&…

Native扩展开发的一般流程(类似开发一个插件)

文章目录大致开发流程1、编写对应的java类服务2、将jar包放到对应位置3、配置文件中进行服务配置4、在代码中调用5、如何查看服务调用成功大致开发流程 1、编写服务,打包为jar包2、将jar包放到指定的位置3、在配置文件中进行配置,调用对应的服务 1、编…

linux 之 ps命令介绍

哈喽,大家好,我是有勇气的牛排(全网同名)🐮 有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。 前言 如过想实现对进程监控,就需要使用到ps命…

macOS 13.3 Beta (22E5219e)发布

系统介绍2 月 17 日消息,苹果今日向 Mac 电脑用户推送了 macOS 13.3 开发者预览版 Beta 更新(内部版本号:22E5219e),本次更新距离上次发布隔了 37 天。macOS Ventura 带来了台前调度、连续互通相机、FaceTime 通话接力…

Vue3+Lodash:2023年了,我依然在使用Lodash

目录 前言: 为什么选择lodash? 看看lodash的地位 如何使用lodash? 1.安装lodash 2.引入lodash 我们到底还需不需要lodash? 再举一些例子 前言: 前两天,在水群的时候,发现居然有人不知lodash&#…

OpenCV-PyQT项目实战(6)项目案例02:滚动条应用

欢迎关注『OpenCV-PyQT项目实战 Youcans』系列,持续更新中 OpenCV-PyQT项目实战(1)安装与环境配置 OpenCV-PyQT项目实战(2)QtDesigner 和 PyUIC 快速入门 OpenCV-PyQT项目实战(3)信号与槽机制 …

基于感知动作循环的层次推理用于视觉问答

title:Hierarchical Reasoning Based on Perception Action Cycle for Visual Question Answering 基于感知动作循环的层次推理用于视觉问答 文章目录title:[Hierarchical Reasoning Based on Perception Action Cycle for Visual Question Answering](…

机器学习技术:多任务学习综述!

Datawhale干货 作者:陈敬,中国移动云能力中心前言本文对多任务学习(multi-task learning, MTL)领域近期的综述文章进行整理,从模型结构和训练过程两个层面回顾了其发展变化,旨在提供一份 MTL 入门指南,帮助大家快速了解…

MySQL的锁机制详解

目录 一.概述 分类 锁的特性 二.MyISAM表锁 如何加表锁 读锁演示 写锁演示 三.InnoDB行锁 行锁特点 行锁模式 一.概述 锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢)。 在数据库中,除传统的计算资源(如…

常见的并发模型

介绍 常见解决并发的策略一般有两种:共享数据和消息传递 基于消息传递的实现有 CSP模型,典型的有Go语言中基于Channel的通讯Actor模型,典型的有Akka中的Actor模型 CSP模型和Actor模型的简单理解: Dont communicate by sharing…

如何使用MQTTX可视化工具

@ [TOC] 使用背景 最近在调试MQTT相关的程序,调试程序时使用的是MQTTX这个工具,它可以创建服务器连接,并且在连接后发布和订阅主题。在调试过程中总结了一些使用方法和技巧,在这里分享给大家。 MQTTX是EMQX公司推出的可视化MQTT调试工具,大家可以到官网下载使用,同时参…

技术实践干货:从零开始创建Node.js应用

作为一个程序员,我们常常会有很多想法和创意,然后用技术实现出来,这是一个很有成就感的事情。 在实践过程中,会发现很多想法都不能很好地落地,可能是技术、可能是团队氛围等等,于是就开始想着能够不能有一个…

类内默认函数

目录 前言: 1. 构造函数 1.1 概念 1.2 特性 1) 2) 2. 析构函数 2.1 概念 2.2 特性 3. 拷贝构造 3.1 概念 3.2 特征 4. 赋值运算符重载 4.1 运算符重载 4.2 赋值运算符重载 5.3 前置和后置的重载 前言: 问&#xf…

AI智能机器人,在这里也可以体验~

“大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。”现在是:2023年2月17日00:14:42前言最近AI智能chatgpt特别的火,相信好多人都已经体验过了,之前我的群里也接入过,奈何总是收到警告和限制…

泛微发布内外协同的客服管理系统-睦客邻

客户服务是企业业务环节中的关键一环,也是确保客户最终满意度的关键一环。好的客户服务是一个组织能持续经营的有力保证。 如何让客服成为客户的好邻里,让客户真实地感受到全方位的服务,从而让组织的服务产生力量和价值。企业对客服有着系统…

LV8731V-TLM-H 带保护步进电机驱动器特性简述

LV8731V-TLM-H是一个2−通道H−桥驱动器IC,它可以切换步进电机驱动器和两个有刷电机驱动器,前者支持1/16−步进分辨率的微步进驱动,后者支持电机的前进、后退、制动和待机。它非常适合驱动办公室设备和娱乐应用中使用的刷直流电机和步进电机。…