含义:
对象数据的持久化操作指的是将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
文件的操作类似于字典,支持对对象的增、删、改、查操作,因此可以方便地存储和检索对象数据。
相同点:
-
持久化功能: 两者都能够实现将 Python 对象存储到文件中,以便在程序重新运行或在其他程序中使用时重新加载这些对象,从而实现对象数据的持久化操作。
-
使用 pickle 序列化: 在内部实现中,两者都使用了
pickle
模块来实现对象的序列化和反序列化,因此都能够存储几乎任何 Python 对象,包括自定义类的实例等。
区别:
-
对象类型:
marshal
模块专门用于序列化 Python 的内部对象,主要是 Python 代码对象,而不是用于通用的 Python 对象。shelve
模块则可以存储任何可通过字典访问的 Python 对象,包括自定义类的实例等。
-
数据存储方式:
marshal
模块直接将序列化后的数据写入文件中,而没有提供键值对的形式来访问数据。shelve
模块将对象存储到文件中,并以键值对的形式进行访问,类似于字典,因此可以方便地对存储的对象进行增、删、改、查等操作。
-
灵活性:
marshal
模块更适合于序列化 Python 内部对象,并不适用于存储用户自定义的数据结构或对象。shelve
模块更灵活,可以存储任意可序列化的 Python 对象,并提供了方便的键值对访问方式。
综上所述,marshal
主要用于序列化 Python 内部对象,而 shelve
则用于存储和管理各种 Python 对象,提供了更灵活的持久化方案。