如何在 Python 中实现持久对象?
要在 Python 中实现持久对象,请使用以下库。
- shelve
- pickle
shelve 模块
“shelf” 是一种持久的类似于字典的对象。与“dbm”数据库的不同之处在于,一个 shelf 中的值(而不是键!)可以是任何 pickle 模块可以处理的本质上任意的 Python 对象。这些包括大多数类实例、递归数据类型和包含许多共享子对象的对象。
它具有一些关键方法 −
- shelve.open() − 打开一个持久化字典。指定的文件名是底层数据库的基本文件名。作为一个副效应,可能会向文件名添加扩展名并创建多个文件。默认情况下,底层数据库文件以读写方式打开。
-
shelve.sync() − 如果使用 writeback 设置为 True 打开了该 shelf,则写回缓存中的所有条目。如果可行,还会清空缓存并将持久化字典与磁盘同步。当使用 close() 关闭 shelf 时,会自动调用此方法。
-
shelve.close() − 同步并关闭持久化字典对象。
pickle 模块
pickle 模块实现了用于序列化和反序列化 Python 对象结构的二进制协议。
- Pickling 是将 Python 对象层次结构转换为字节流的过程。要序列化对象层次结构,只需调用 dumps() 函数。
-
Unpickling 是反向操作。将来自二进制文件或类似字节对象的字节流转换回对象层次结构。要反序列化数据流,调用 loads() 函数。
pickle 模块函数
pickle 模块提供了以下函数。
- pickle.dump() − 将对象的 pickled 表示写入打开的文件对象 file。
-
pickle.dumps() − 返回对象的 pickled 表示作为一个字节对象,而不是写入文件。
-
pickle.load() − 从打开的文件对象文件中读取对象的 pickled 表示。
-
pickle.loads() − 返回对象的 pickled 表示数据的重构对象层次结构
例子
首先导入 pickle 模块−
import pickle
我们已经创建了以下输入以被 pickled。
my_data = { 'BMW', 'Audi', 'Toyota', 'Benz'}
创建 demo.pickle 文件。这个同样的 .pickle 文件使用上面的列表逛被 pickled。
with open("demo.pickle","wb") as file_handle:
pickle.dump(my_data, file_handle, pickle.HIGHEST_PROTOCOL)
现在,取消 pickle 上面的 pickled 文件并获取输入值。
with open("demo.pickle","rb") as file_handle:
res = pickle.load(file_handle)
print(res_data)
现在我们来看完整的示例。
import pickle
# 输入数据
my_data = { 'BMW', 'Audi', 'Toyota', 'Benz'}
# 将输入数据序列化
with open("demo.pickle","wb") as file_handle:
pickle.dump(my_data, file_handle, pickle.HIGHEST_PROTOCOL)
# 从序列化后的数据中加载
with open("demo.pickle","rb") as file_handle:
res = pickle.load(file_handle)
print(my_data) # 显示输出
输出
set(['Benz', 'Toyota', 'BMW', 'Audi'])