Python 数据持久化 - Shelve 模块



Python 标准库中的 shelve 模块提供了一种简单而有效的对象持久化机制。此模块中定义的 shelf 对象是一个类似字典的对象,它持久地存储在磁盘文件中。这会创建一个类似于类 UNIX 系统上 dbm 数据库的文件。

shelf 字典有一些限制。只有字符串数据类型可以用作此特殊字典对象中的键,而任何可 pickle 的 Python 对象都可以用作值。

shelve 模块定义了以下三个类:

序号 Shelve 模块及说明
1

Shelf

这是 shelf 实现的基类。它使用类似字典的对象进行初始化。

2

BsdDbShelf

这是 Shelf 类的子类。传递给其构造函数的 dict 对象必须支持 first()、next()、previous()、last() 和 set_location() 方法。

3

DbfilenameShelf

这也是 Shelf 的子类,但它接受文件名作为其构造函数的参数,而不是 dict 对象。

shelve 模块中定义的 open() 函数返回一个DbfilenameShelf对象。

open(filename, flag='c', protocol=None, writeback=False)

文件名参数分配给创建的数据库。flag 参数的默认值为“c”,表示读写访问。其他标志为“w”(只写)“r”(只读)和“n”(新的读写)。

序列化本身由 pickle 协议控制,默认为 none。最后一个参数 writeback 参数默认为 false。如果设置为 true,则缓存访问的条目。每次访问都会调用 sync() 和 close() 操作,因此过程可能会很慢。

以下代码创建了一个数据库并在其中存储字典条目。

import shelve
s=shelve.open("test")
s['name']="Ajay"
s['age']=23
s['marks']=75
s.close()

这将在当前目录中创建 test.dir 文件,并将键值数据以哈希形式存储。Shelf 对象具有以下可用方法:

序号 方法及说明
1

close()

同步并关闭持久字典对象。

2

sync()

如果 shelf 以 writeback 设置为 True 打开,则写回缓存中的所有条目。

3

get()

返回与键关联的值

4

items()

元组列表 - 每个元组都是键值对

5

keys()

shelf 键的列表

6

pop()

删除指定的键并返回相应的值。

7

update()

从另一个 dict/iterable 更新 shelf

8

values()

shelf 值的列表

要访问 shelf 中特定键的值,请执行以下操作:

s=shelve.open('test')
print (s['age']) #this will print 23
   s['age']=25
print (s.get('age')) #this will print 25
s.pop('marks') #this will remove corresponding k-v pair

与内置字典对象一样,items()、keys() 和 values() 方法返回视图对象。

print (list(s.items()))
[('name', 'Ajay'), ('age', 25), ('marks', 75)]  

print (list(s.keys()))
['name', 'age', 'marks']

print (list(s.values()))
['Ajay', 25, 75]

要将另一个字典的条目与 shelf 合并,请使用 update() 方法。

d={'salary':10000, 'designation':'manager'}
s.update(d)
print (list(s.items()))

[('name', 'Ajay'), ('age', 25), ('salary', 10000), ('designation', 'manager')]
广告