shelve
shelve — Python object persistence
源代码:
Lib / shelve.py
“货架”是一个持久的,类似字典的对象。与“dbm”数据库的不同之处在于,货架上的值(不是关键字!)本质上可以是任意的Python对象 - pickle
模块可以处理的任何东西。这包括大多数类实例,递归数据类型和包含大量共享子对象的对象。键是普通的字符串。
shelve.open(filename, flag='c', protocol=None, writeback=False)
打开一个持久字典。指定的文件名是底层数据库的基本文件名。作为副作用,可以将扩展名添加到文件名中,并且可以创建多个文件。默认情况下,打开底层数据库文件以进行读取和写入。可选的标志
参数与标志
参数的含义相同anydbm.open()
。
默认情况下,版本0酱菜用于序列化值。pickle协议
的版本可以用协议
参数指定。
在版本2.3中更改:添加了协议
参数。
由于Python的语义,一个书架无法知道何时修改了可变的持久字典条目。默认情况下,修改后的对象仅
在分配给货架时才
写入(请参阅示例)。如果可选写回
参数设置为True
,访问的所有项目也缓存在内存中,并在写回
sync()
和close(
这可以更容易地修改持久性字典中的可变条目,但是,如果访问了很多条目,它可能会消耗大量的缓存内存,并且它可以使关闭操作非常缓慢,因为所有访问的条目都被写回
(没有办法确定哪些访问条目是可变的,哪些实际上是变异的)。
与文件对象一样,应该明确关闭搁置对象以确保将持久性数据刷新到磁盘。
警告
由于该shelve
模块由后台支持pickle
,因此从不受信任的源加载架子是不安全的。像pickle
一样,加载一个架子可以执行任意代码。
货架对象支持字典支持的大多数方法。这简化了从基于字典的脚本到需要持久存储的脚本的过渡。
注意,Python的3过渡的方法(viewkeys()
,viewvalues()
,和viewitems()
)不被支持。
还支持另外两种方法:
Shelf.sync()
如果搁架已打开且写回
设置为,则将高速缓存中的所有条目写回
True
。如果可行,还清空缓存并同步磁盘上的持久字典。这在货架关闭时自动调用close()
。
Shelf.close()
同步并关闭持久性字典
对象。在一个封闭的架子上操作将失败,一个ValueError
。
1.限制
- 其中的数据库包将被使用的选择(例如
dbm
,gdbm
或bsddb
)取决于哪个接口是可用的。因此直接使用打开数据库是不安全的dbm
。数据库也(不幸)受限于dbm
(如果使用的话) - 这意味着存储在数据库中的对象(腌制表示)应该相当小,并且在极少数情况下,重要的冲突可能会导致数据库拒绝更新。
- 该
shelve
模块不支持对搁置对象的并发
读取/写入访问。(多个同时读取访问是安全的。)当一个程序有一个可写入的架子时,其他程序不应该打开它来读取或写入。Unix文件锁定可以用来解决这个问题,但是这在Unix版本中是不同的,并且需要关于所使用的数据库实现的知识。
class shelve.Shelf(dict, protocol=None, writeback=False)
A subclass of UserDict.DictMixin
which stores pickled values in the dict
object.
默认情况下,版本0酱菜用于序列化值。pickle
协议
的版本可以用协议
参数指定。请参阅pickle
文档以了解有关咸菜协议
的讨论。
在版本2.3中更改:添加了协议
参数。
如果写回
参数是True
,对象将保存所有访问条目的缓存,并在同步和关闭时间将它们写回
字典
。这允许对可变条目进行自然操作,但可能消耗更多内存并使同步和关闭需要很长时间。
class shelve.BsdDbShelf(dict, protocol=None, writeback=False)
子类的Shelf
暴露first()
,next()
,previous()
,last()
和set_location()
是适用于哪些bsddb
模块而不是在其他数据库模块。传递给构造函数的dict
对象必须支持这些方法。这通常是通过调用一个完成的bsddb.hashopen()
,bsddb.btopen()
或bsddb.rnopen()
。可选的协议
和写回
参数与Shelf
该类具有相同的解释。
class shelve.DbfilenameShelf(filename, flag='c', protocol=None, writeback=False)
它的一个子类Shelf
接受一个文件名
而不是一个类似dict的对象。底层文件将使用打开anydbm.open()
。默认情况下,该文件将被创建并打开以供读取和写入。可选的标志
参数与该open()
功能具有相同的解释。可选的协议
和写回
参数与Shelf
该类具有相同的解释。
2.例子
总结界面(key
是一个字符串,data
是一个任意的对象):
import shelve
d = shelve.open(filename) # open -- file may get suffix added by low-level
# library
d[key] = data # store data at key (overwrites old data if
# using an existing key)
data = d[key] # retrieve a COPY of data at key (raise KeyError if no
# such key)
del d[key] # delete data stored at key (raises KeyError
# if no such key)
flag = d.has_key(key) # true if the key exists
klist = d.keys() # a list of all existing keys (slow!)
# as d was opened WITHOUT writeback=True, beware:
d['xx'] = range(4) # this works as expected, but...
d['xx'].append(5) # *this doesn't!* -- d['xx'] is STILL range(4)!
# having opened d without writeback=True, you need to code carefully:
temp = d['xx'] # extracts the copy
temp.append(5) # mutates the copy
d['xx'] = temp # stores the copy right back, to persist it
# or, d=shelve.open(filename,writeback=True) would let you just code
# d['xx'].append(5) and have it work as expected, BUT it would also
# consume more memory and make the d.close() operation slower.
d.close() # close it