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.mzph.cn/pingmian/9105.shtml

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

相关文章

谷歌明年6月关闭 Google Fit 运动记录API,要求开发者迁移至Android Health平台 | 最新快讯

5 月 6 日消息,谷歌近日发布官方新闻稿,宣布将在明年 6 月使用 Android Health 平台取代 Google Fit 运动记录 API,开发人员应当尽早启动迁移计划。 谷歌自 2022 年起逐渐扩大对 Android Health 平台的投资,旨在减少平台碎片化&am…

Java17 --- SpringCloud之Zipkin链路追踪

目录 一、下载zipkin及运行 二、在父工程中引入pom依赖 三、在子工程8001引入相关pom依赖 3.1、修改yml配置文件 3.2、测试代码 四、在子工程80引入相关pom依赖 4.1、修改yml配置文件 4.2、测试代码 五、测试结果 一、下载zipkin及运行 运行控制台访问地址&#xff1…

Linux学习笔记1---Windows上运行Linux

在正点原子的教程中学习linux需要安装虚拟机或者在电脑上安装一个Ubuntu系统,但个人觉得太麻烦了,现在linux之父加入了微软,因此在Windows上也可以运行linux 了。具体方法如下: 一、 在Windows上的设置 在window的搜索框内&#…

【Java】还不会数组?一文万字全搞定

前言:前面两章我们详细讲解了Java基本程序设计结构中的基本知识,,包括:一个简单的Java应用,注释,数据类型,变量与常量,运算符,字符串,输入输出,控…

代码随想录算法训练营第二十三天|617.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

617.二叉搜索树的最小绝对差 文档讲解:代码随想录 题目链接:. - 力扣(LeetCode) 遇到二叉搜索树,就要知道这棵树在中序遍历的情况下是一个升序的遍历。 这道题目的难点就是如何使用双指针遍历二叉树,一个指向中序遍历…

三条命令快速配置Hugging Face

大家好啊,我是董董灿。 本文给出一个配置Hugging Face的方法,让你在国内可快速从Hugging Face上下在模型和各种文件。 1. 什么是 Hugging Face Hugging Face 本身是一家科技公司,专注于自然语言处理(NLP)和机器学习…

写爬虫代码抓取Asterank中小行星数据

2024年5月4日 问题来源 解决方案 回顾2023年7月14日自己写的爬虫代码 import requests import re import pandas as pd texts[] def getData(page):#每页评论的网址urlhttps://item.jd.com/51963318622.html#comment#添加headers,伪装成浏览器headers{User-Agent:…

即插即用 | YOLOv8热力图可视化方法详解,揭秘AI如何「看」世界!【附完整源码】

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

常见的前端框架

常用的前端框架有以下几种: 模型 React:由Facebook开发的一款前端框架,采用虚拟DOM的概念,可高效地更新页面。Vue.js:一款轻量级的前端框架,易学易用,支持组件化开发和双向数据绑定。AngularJ…

接口框架项目实战-pytest(四)请求封装接口关联

把所有的请求方法集中到一个地方 目的:利于后期维护和加入日志 异常处理 等 目的:框架封装好之后,功能测试不需要写代码,也能执行自动化测试 config.yml base:base_php_url: http://47.107.116.139base_wx_url: https://api.weix…

vivado 低级别 SVF JTAG 命令、多链 SVF 操作

多链 SVF 操作 以下示例显示了如何在 SVF 链上处理操作。 每个链中连接有 2 个器件 : xcku11 和 xcku9 。配置存储器连接到链中的第 2 个器件 (xcku9) 。为访问此配置存储器 , SVF 会使用 HIR 、 HDR 、 TIR 和 TDR 命令来生成命令。为刷写此…

路由模块封装

目录 一、问题引入 二、步骤 一、问题引入 随着项目内容的不断扩大,路由也会越来越多,把所有的路由配置都堆在main.js中就不太合适了,所以需要将路由模块抽离出来。其好处是:拆分模块,利于维护。 二、步骤 将路由相…

小巧简单实用的Linux端口转发工具Rinetd

Linux下实现端口转发有很多种方法,尤其是在可以联网的情况下,更是容易。最近在资源受限的定制系统中,找到一个方便离线安装和使用的端口转发工具Rinetd,安装包仅几十K,而且有很多版本的Linux发行系统的支持。 1、安装…

Spring底层入门(九)

boot的执行流程分为构造SpringApplication对象、调用run方法两部分 1、Spring Boot 执行流程-构造 通常我们会在SpringBoot的主启动类中写以下的代码: 参数一是当前类的字节码,参数二是main的args参数。 public class StartApplication {public static…

解决jar包中没有主清单目录的问题

文章目录 解决jar包中没有主清单目录的问题问题描述环境描述方法一 | 阿里巴巴构造器的通用解决方案方式二 | 指定MANIFEST.MF路径 解决jar包中没有主清单目录的问题 问题描述 很简单可能很多人都遇到过,maven项目打成jar包后执行报错:jar包中没有主清单…

揭秘:深度学习与自然语言处理的本质差异

在人工智能的广阔天地中,深度学习与自然语言处理犹如两颗耀眼的明星,各自绽放着光芒。尽管它们时常在科技文章中齐头并进,但它们的核心区别与联系常常令人迷惑。如果你希望一次性搞懂这两个人工智能领域的差异和联系,那么本文将是…

2024OD机试卷-数组连续和 (java\python\c++)

题目:数组连续和 题目描述 给定一个含有N个正整数的数组, 求出有多少个连续区间(包括单个正整数), 它们的和大于等于x。 输入描述 第一行两个整数N x(0 < N <= 100000, 0 <= x <= 10000000) 第二行有N个正整数(每个正整数小于等于100)。 输出描述 输出一…

Spring Security 入门 2

1.项目实战 就以RuoYi-Vue 为例吧&#xff0c;主要以下几点原因&#xff1a; 基于 Spring Security 实现。 基于 RBAC 权限模型&#xff0c;并且支持动态的权限配置。 基于 Redis 服务&#xff0c;实现登录用户的信息缓存。 前后端分离。同时前端采用 Vue &#xff0c;相对来…

ai可以做思维导图吗?当然是可以的!

ai可以做思维导图吗&#xff1f;在快节奏的现代生活中&#xff0c;思维导图作为一种高效的信息组织和表达工具&#xff0c;越来越受到人们的青睐。随着人工智能&#xff08;AI&#xff09;技术的不断发展&#xff0c;AI思维导图软件也应运而生&#xff0c;它们不仅能够帮助用户…

Qt | QValidator 抽象类(验证器)及其子类|QDoubleValidator 类|QIntValidator 类

01、上节回顾 Qt | QComboBox(组合框)Qt | QLineEdit 类(行编辑器)02、QValidator 1、QValidator 类直接继承自 QObject 类,且是一个抽象类,因此具体功能主要由其子类来实现,或者子类化该类实现自定义的验证器。 2、验证器的作用是验证用户输入的