首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

shelve

源代码: 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.限制

  • 其中的数据库包将被使用的选择(例如dbmgdbmbsddb)取决于哪个接口是可用的。因此直接使用打开数据库是不安全的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是一个任意的对象):

代码语言:javascript
复制
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

扫码关注腾讯云开发者

领取腾讯云代金券