Python中对象数据的持久化操作

含义:

对象数据的持久化操作指的是将Python程序中的对象保存到某种形式的持久化存储介质(如文件、数据库)中,以便在程序重新运行或在其他程序中使用时能够重新加载这些对象。持久化操作可以确保数据在程序关闭后不会丢失,并且可以在需要时重新加载以恢复程序的状态。在Python中,对象数据的持久化操作通常涉及将对象序列化为某种格式,存储到文件或数据库中,然后在需要时反序列化以恢复对象。

实现

marshal模块:

marshal 模块是 Python 中的一个内置模块,用于序列化和反序列化 Python 对象。它与 pickle 模块相似,但有一些区别。与 pickle 不同,marshal 专门用于 Python 的内部对象,而不是用于通用的 Python 对象。marshal 的主要目的是提供一种方式来序列化 Python 代码对象以进行交换和存储。

import marshal

# 序列化对象
serialized_data = marshal.dumps(obj)

# 反序列化对象
obj = marshal.loads(serialized_data)

在这个示例中,marshal.dumps() 函数接受一个 Python 对象作为参数,并返回其序列化后的字节串。marshal.loads() 函数则接受一个字节串,并返回反序列化后的 Python 对象。

需要注意的是,由于 marshal 专门用于 Python 内部对象的序列化,它不支持自定义类的实例或其他非内置对象。如果需要序列化自定义类的实例或其他非内置对象,应该使用 pickle 或其他序列化模块。

此外,marshal 序列化的数据是 Python 版本相关的,因此在不同版本的 Python 中,序列化后的数据可能不兼容。因此,一般情况下,建议使用 pickle 或其他通用的序列化模块来序列化 Python 对象。

shelve模块:

shelve 模块是 Python 标准库中用于创建简单的对象持久化存储的模块。它提供了一种将 Python 对象存储到文件中并以键值对的形式进行访问的方式。shelve 模块使用了 pickle 来实现对象的序列化和反序列化,并在底层使用了 dbm (数据库管理)模块来管理数据。

import shelve

# 打开一个 shelve 文件
with shelve.open('mydata') as db:
    # 存储对象
    db['key'] = obj
    
# 从 shelve 文件中加载对象
with shelve.open('mydata') as db:
    obj = db['key']

在这个示例中,shelve.open() 函数用于打开一个 shelve 文件,如果文件不存在则会创建一个新的。使用 with 上下文管理器可以确保在退出代码块时文件被正确关闭。

你可以将任何可通过字典访问的对象存储到 shelve 文件中,通过指定键来存储和访问对象。存储的对象会被 pickle 序列化,因此可以是几乎任何 Python 对象,包括自定义类的实例。

需要注意的是,由于 shelve 使用 pickle 来进行序列化,因此存储的对象应该是可序列化的。如果对象中包含了无法序列化的元素,那么存储和加载操作可能会失败。

另外,shelve 文件的操作类似于字典,支持对对象的增、删、改、查操作,因此可以方便地存储和检索对象数据。

相同点:

  1. 持久化功能: 两者都能够实现将 Python 对象存储到文件中,以便在程序重新运行或在其他程序中使用时重新加载这些对象,从而实现对象数据的持久化操作。

  2. 使用 pickle 序列化: 在内部实现中,两者都使用了 pickle 模块来实现对象的序列化和反序列化,因此都能够存储几乎任何 Python 对象,包括自定义类的实例等。

区别:

  1. 对象类型:

    • marshal 模块专门用于序列化 Python 的内部对象,主要是 Python 代码对象,而不是用于通用的 Python 对象。
    • shelve 模块则可以存储任何可通过字典访问的 Python 对象,包括自定义类的实例等。
  2. 数据存储方式:

    • marshal 模块直接将序列化后的数据写入文件中,而没有提供键值对的形式来访问数据。
    • shelve 模块将对象存储到文件中,并以键值对的形式进行访问,类似于字典,因此可以方便地对存储的对象进行增、删、改、查等操作。
  3. 灵活性:

    • marshal 模块更适合于序列化 Python 内部对象,并不适用于存储用户自定义的数据结构或对象。
    • shelve 模块更灵活,可以存储任意可序列化的 Python 对象,并提供了方便的键值对访问方式。

综上所述,marshal 主要用于序列化 Python 内部对象,而 shelve 则用于存储和管理各种 Python 对象,提供了更灵活的持久化方案。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在windows下使用VS Code、CMake、Make进行代码编译

软件环境 Windows11VS CodeNoneCMake3.26.4-windows-x86_64MinGWNone 电脑系统配置 安装MinGW将MinGW安装文件夹中bin文件夹下的mingw32-make.exe复制并重命名为make.exe在文件夹中添加系统路径,具体位置为 系统->系统信息->高级系统设置->高级->环境…

马化腾用“不负众望”,来评价视为“全村希望”的视频号

我是王路飞。 2023年的视频号,给了腾讯足够的惊喜。 去年一年,视频号电商GMV实现近3倍增长(约为1200亿~1500亿)。2023年三季度,视频号总播放量同比增长超50%; 2023年视频号供给数量同比增长超…

【python】模拟巴特沃斯滤波器

巴特沃斯滤波器(Butterworth Filter),以其设计者斯蒂芬巴特沃斯(Stephen Butterworth)的名字命名,是一种具有平滑频率响应的滤波器。这种滤波器在频域中具有非常平坦的无波纹响应,直到它达到截止…

一文了解CloudXR优势及应用原理

CloudXR是一种新颖而先进的技术,旨在将虚拟现实和增强现实体验从本地设备转移到云端,主要功能也包括了远程渲染、流媒体传输、低延迟、高带宽和高质量的音视频传输。CloudXR(云化XR)可以将高保真度的虚拟现实或增强现实场景实时传…

线程的常见方法

线程的常见方法 休眠: 让当前状态不再参与cpu的竞争,直到休眠结束; 结果:并不是完全交替进行的,因为只是休眠状态,也会存在争抢cpu 放弃: 让当前状态主动放弃时间片,下次再去争抢…

如何在PPT中插入网页?这样操作,免费还高效!

融合课、跨学科课,已经是近两年来教育界的热门词。 在公开课、微课比赛中,不添融合一些较为先进的信息技术,都不好意思拿出手了。 最近,由不坑老师开发制作的Office插件——不坑盒子,实现了在PPT中插入网页&#xff…

[性能优化] ScrollView视图优化为循环列表

问题描述: 原先商城的物品栏中的item 是load在一个scrollView 下,用于滑动查看。仅仅在父级panel下是使用了NGUI原生的scrollview 组件,随着商场物品列表中新物品的增多。panel下加载的实例也非常庞大。而大部分的实例用户也无法看到&#x…

es使用遇到的bug总结

本来版本7.4.0不行,最后换了个版本7.15.1就可以了,但又出现以下问题了: Beanpublic ElasticsearchClient elasticsearchClient() { // RestClient client RestClient.builder(new HttpHost("localhost", 9200,"http&q…

Duplicate entry ‘asdfg‘ for key ‘clazz.name‘

Mybatis:java.sql.SQLIntegrityConstraintViolationException:Duplicate entry ‘asdfg’ for key ‘clazz.name’ 违反了数据库的唯一约束条件,即插入数据的时候具有唯一约束(被unique修饰)的列值重复了 在修改的过程中发生错误,…

一文玩转Vue3参数传递——全栈开发之路--前端篇(8)

全栈开发一条龙——前端篇 第一篇:框架确定、ide设置与项目创建 第二篇:介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇:setup语法,设置响应式数据。 第四篇:数据绑定、计算属性和watch监视 第五篇 : 组件…

ORA-02020:过多的数据库链接在使用

一、问题描述 今天同事说,有一个查询功能,同时查了几个子平台的dblink,页面返回报错。 提示ORA-02020:过多的数据库链接在使用; bad SQL grammar 二、解决办法 1)分析业务需求 分析业务场景 ,发…

基于Vue3与ElementUI Plus的酷企秀场景可视化DIY设计器:前端技术引领下的数字化展示新篇章

一、引言 在当今信息化高速发展的时代,企业对于展示自身形象、提升用户体验以及增强品牌知名度的需求日益迫切。针对这一市场需求,我们推出了基于Vue3与ElementUI Plus的酷企秀场景可视化DIY设计器。该产品不仅具备电子画册、VR全景、地图秀三大核心功能…

Mybatis存储数据将数据转为json

第一种方法 先创建一个表类型如下 创建一个项目&#xff0c;写一个接口 &#xff0c; 写一个JsonTypeHandler类继承BaseTypeHandler public class JsonTypeHandler<T> extends BaseTypeHandler<T> {private Class<T> clazz;//构造函数 --- >接收一个 Cl…

大数据Scala教程从入门到精通第五篇:Scala环境搭建

一&#xff1a;安装步骤 1&#xff1a;scala安装 1&#xff1a;首先确保 JDK1.8 安装成功: 2&#xff1a;下载对应的 Scala 安装文件 scala-2.12.11.zip 3&#xff1a;解压 scala-2.12.11.zip 4&#xff1a;配置 Scala 的环境变量 在Windows上安装Scala_windows安装scala…

多线程三种实现

多线程 线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。 &#xff08;理解&#xff1a;应用软件中互相独立&#xff0c;可以同时运行的功能&#xff09; 进程 进程是程序的基本执行实体。&#xff08;理解&#…

【动态规划】:路径问题_地下城游戏

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本专栏是关于各种算法的解析&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结构专栏&…

【LLM 论文】Least-to-Most Prompting 让 LLM 实现复杂推理

论文&#xff1a;Least-to-Most Prompting Enables Complex Reasoning in Large Language Models ⭐⭐⭐ Google Research, ICLR 2023 论文速读 Chain-of-Thought&#xff08;CoT&#xff09; prompting 的方法通过结合 few-show prompt 的思路&#xff0c;让 LLM 能够挑战更具…

MySQL#MySql表的操作

目录 一、创建表 二、查看表结构 三、修改表 1.修改表的名字 2.新增一个列 3.修改列 4.删除列 5.修改列的名称 四、删除表 一、创建表 语法&#xff1a; CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校…

2042193-77-9,BDP FL甲基四嗪可用于标记细胞和组织样本

1.基本信息&#xff1a; BDP FL甲基四嗪是一种具有独特化学和光学性质的化合物。 2.化学结构&#xff1a; BDP FL甲基四嗪是含有甲基四嗪基团的BDP染料连接体。BDP FL部分是指附着在甲基四嗪上的荧光标记&#xff0c;使其在暴露于特定波长的光时能够发光。 甲基四嗪是一种具有…

C语言【文件操作 2】

文章目录 前言顺序读写函数的介绍fputc && fgetcfputcfgetc fputs && fgetsfputsfgets fprintf && fscanffprintffscanf fwrite && freadfwritefread 文件的随机读写fseek函数偏移量ftell函数rewind函数 文件的结束判断被错误使用的feof 结语 …