Python数据持久化 Shelve模块
Python标准库中的shelve模块提供了简单而有效的对象持久化机制。在这个模块中定义的shelf对象是类似字典的对象,它被持久化地存储在一个磁盘文件中。这创建了一个类似于 UNIX 系统上的 dbm 数据库的文件。
货架上的字典有一些限制。在这个特殊的字典对象中,只有字符串数据类型可以作为键,而任何可拾取的 Python 对象可以作为值。
货架模块定义了三个类,如下所示
序号 | 货架模块和描述 |
---|---|
1 | Shelf 这是货架实现的基类。它被初始化为类似dict的对象。 |
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)
文件名参数被分配给创建的数据库。标志参数的默认值是’c’,用于读/写访问。其他标志是’w’(只写)’r’(只读)和’n’(带读/写的新)。
序列化本身由pickle协议管理,默认为无。最后一个参数writeback参数默认为false。如果设置为true,被访问的条目会被缓存起来。每次访问都会调用sync()和close()操作,因此过程可能很慢。
下面的代码创建了一个数据库并在其中存储了字典条目。
import shelve
s=shelve.open("test")
s['name']="Ajay"
s['age']=23
s['marks']=75
s.close()
这将在当前目录下创建test.dir文件并以散列形式存储键值数据。货架对象有以下方法可用
序号 | 方法和描述 |
---|---|
1 | close() 同步并关闭持久化的dict对象。 |
2 | sync() 写回缓存中的所有条目,如果架子被打开时写回设置为True。 |
3 | get() 返回与键相关的值 |
4 | items() 图元的列表 – 每个图元是键值对 |
5 | keys() 架子上的键的列表 |
6 | pop() 删除指定的键并返回相应的值。 |
7 | update() 从另一个dict/iterable更新书架 |
8 | values() 货架上的值的列表 |
要访问货架中某一特定键的值:
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]
使用update()方法将另一个字典的项目与货架合并。
d={'salary':10000, 'designation':'manager'}
s.update(d)
print (list(s.items()))
[('name', 'Ajay'), ('age', 25), ('salary', 10000), ('designation', 'manager')]