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 对象,提供了更灵活的持久化方案。

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bug.ink

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值