dbm ---与Unix“数据库”的接口

源代码: Lib/dbm/__init__.py


dbm 是DBM数据库变体的通用接口--- dbm.gnudbm.ndbm . 如果没有安装这些模块,模块中缓慢但简单的实现 dbm.dumb 将被使用。有一个 third party interface 到Oracle Berkeley数据库。

exception dbm.error

一个元组,包含每个受支持的模块都可以引发的异常,其中一个唯一的异常也被命名为 dbm.error 作为第一项---后者用于 dbm.error 提高了。

dbm.whichdb(filename)

此函数尝试猜测可用的几个简单数据库模块中的哪一个--- dbm.gnudbm.ndbmdbm.dumb ---应用于打开给定的文件。

返回以下值之一: None 如果由于文件不可读或不存在而无法打开;空字符串 ('' )如果无法猜测文件的格式;或者包含所需模块名的字符串,例如 'dbm.ndbm''dbm.gnu' .

dbm.open(file, flag='r', mode=438)

打开数据库文件 file 并返回相应的对象。

如果数据库文件已存在,则 whichdb() 函数用于确定其类型并使用适当的模块;如果不存在,则使用上面列出的可导入的第一个模块。

可选的 flag 参数可以是:

价值

意义

'r'

以只读方式打开现有数据库(默认)

'w'

打开现有数据库进行读写

'c'

打开数据库进行读写,如果不存在则创建它

'n'

总是创建一个新的、空的数据库,以供读取和写入

可选的 mode 参数是文件的Unix模式,仅在必须创建数据库时使用。它默认为八进制 0o666 (并将由现行的umask进行修改)。

返回的对象 open() 支持与字典相同的基本功能;可以存储、检索和删除键及其对应的值,以及 in 操作员和 keys() 方法可用,以及 get()setdefault() .

在 3.2 版更改: get()setdefault() 现在在所有数据库模块中都可用。

在 3.8 版更改: 从只读数据库中删除键会引发数据库模块特定的错误,而不是 KeyError .

键和值始终存储为字节。这意味着当使用字符串时,它们在被存储之前被隐式转换为默认编码。

这些对象还支持在 with 语句,完成后将自动关闭它们。

在 3.4 版更改: 向返回的对象添加了对上下文管理协议的本机支持 open() .

下面的示例记录一些主机名和相应的标题,然后打印出数据库的内容:

import dbm

# Open database, creating it if necessary.
with dbm.open('cache', 'c') as db:

    # Record some values
    db[b'hello'] = b'there'
    db['www.python.org'] = 'Python Website'
    db['www.cnn.com'] = 'Cable News Network'

    # Note that the keys are considered bytes now.
    assert db[b'www.python.org'] == b'Python Website'
    # Notice how the value is now in bytes.
    assert db['www.cnn.com'] == b'Cable News Network'

    # Often-used methods of the dict interface work too.
    print(db.get('python.org', b'not present'))

    # Storing a non-string key or value will raise an exception (most
    # likely a TypeError).
    db['www.yahoo.com'] = 4

# db is automatically closed when leaving the with statement.

参见

模块 shelve

存储非字符串数据的持久性模块。

各个子模块在以下章节中进行了描述。

dbm.gnu ——GNU对DBM的重新解释

源代码: Lib/dbm/gnu.py


这个模块与 dbm 模块,但使用GNU库 gdbm 而是提供一些附加功能。请注意,文件格式由 dbm.gnudbm.ndbm 不兼容。

这个 dbm.gnu 模块为GNU DBM库提供接口。 dbm.gnu.gdbm 对象的行为类似于映射(字典),除了键和值总是在存储前转换为字节。打印A gdbm 对象不打印键和值,并且 items()values() 不支持方法。

exception dbm.gnu.error

提出 dbm.gnu -特定错误,如I/O错误。 KeyError 针对常规映射错误(如指定不正确的键)引发。

dbm.gnu.open(filename[, flag[, mode]])

打开一个 gdbm 数据库并返回 gdbm 对象。这个 filename 参数是数据库文件的名称。

可选的 flag 参数可以是:

价值

意义

'r'

以只读方式打开现有数据库(默认)

'w'

打开现有数据库进行读写

'c'

打开数据库进行读写,如果不存在则创建它

'n'

总是创建一个新的、空的数据库,以供读取和写入

可以将以下附加字符附加到标记后,以控制如何打开数据库:

价值

意义

'f'

以快速模式打开数据库。对数据库的写入将不同步。

's'

同步模式。这将导致对数据库的更改立即写入文件。

'u'

不要锁定数据库。

并非所有标志对的所有版本都有效 gdbm . 模块常数 open_flags 是一个支持的标志字符字符串。例外 error 如果指定的标志无效,则引发。

可选的 mode 参数是文件的Unix模式,仅在必须创建数据库时使用。它默认为八进制 0o666 .

除了字典式的方法外, gdbm 对象具有以下方法:

gdbm.firstkey()

可以使用此方法和 nextkey() 方法。遍历的顺序是 gdbm 的内部hash值,不会按键值排序。此方法返回起始键。

gdbm.nextkey(key)

返回以下键 key 在穿越中。以下代码打印数据库中的每个键 db ,而不必在内存中创建包含它们的列表::

k = db.firstkey()
while k != None:
    print(k)
    k = db.nextkey(k)
gdbm.reorganize()

如果您执行了大量删除操作,并且希望缩小 gdbm 文件,此例程将重新组织数据库。 gdbm 对象不会缩短数据库文件的长度,除非使用此重组;否则,删除的文件空间将保留并重新使用,因为添加了新的(键、值)对。

gdbm.sync()

当数据库以快速模式打开时,此方法强制将任何未写入的数据写入磁盘。

gdbm.close()

关闭 gdbm 数据库。

dbm.ndbm ---基于ndbm的接口

源代码: Lib/dbm/ndbm.py


这个 dbm.ndbm 模块提供到Unix“(n)DBM”库的接口。DBM对象的行为类似于映射(字典),但键和值始终存储为字节。打印A dbm 对象不打印键和值,并且 items()values() 不支持方法。

该模块可以与“经典”的NDBM接口或GNUGDBM兼容接口一起使用。在Unix上, configure 脚本将尝试定位适当的头文件以简化构建此模块。

exception dbm.ndbm.error

提出 dbm.ndbm -特定错误,如I/O错误。 KeyError 针对常规映射错误(如指定不正确的键)引发。

dbm.ndbm.library

名称 ndbm 使用了实现库。

dbm.ndbm.open(filename[, flag[, mode]])

打开DBM数据库并返回 ndbm 对象。这个 filename 参数是数据库文件的名称(不带 .dir.pag 扩展名)。

可选的 flag 参数必须是以下值之一:

价值

意义

'r'

以只读方式打开现有数据库(默认)

'w'

打开现有数据库进行读写

'c'

打开数据库进行读写,如果不存在则创建它

'n'

总是创建一个新的、空的数据库,以供读取和写入

可选的 mode 参数是文件的Unix模式,仅在必须创建数据库时使用。它默认为八进制 0o666 (并将由现行的umask进行修改)。

除了字典式的方法外, ndbm 对象提供以下方法:

ndbm.close()

关闭 ndbm 数据库。

dbm.dumb ——可移植DBM实现

源代码: Lib/dbm/dumb.py

注解

这个 dbm.dumb 模块是 dbm 当一个更坚固的模块不可用时。这个 dbm.dumb 模块不是为速度而写的,而且使用的频率也不如其他数据库模块高。


这个 dbm.dumb 模块提供了一个持久的类似字典的接口,该接口完全用Python编写。与其他模块不同,如 dbm.gnu 不需要外部库。与其他持久映射一样,键和值始终存储为字节。

模块定义如下:

exception dbm.dumb.error

提出 dbm.dumb -特定错误,如I/O错误。 KeyError 针对常规映射错误(如指定不正确的键)引发。

dbm.dumb.open(filename[, flag[, mode]])

打开一个 dumbdbm 数据库并返回一个dumbm对象。这个 filename 参数是数据库文件的基名称(没有任何特定的扩展名)。创建dumbm数据库时,文件 .dat.dir 扩展名已创建。

可选的 flag 参数可以是:

价值

意义

'r'

以只读方式打开现有数据库(默认)

'w'

打开现有数据库进行读写

'c'

打开数据库进行读写,如果不存在则创建它

'n'

总是创建一个新的、空的数据库,以供读取和写入

可选的 mode 参数是文件的Unix模式,仅在必须创建数据库时使用。它默认为八进制 0o666 (并将由现行的umask进行修改)。

警告

由于python的ast编译器中的堆栈深度限制,在使用足够大/复杂的条目加载数据库时,可能会导致python解释器崩溃。

在 3.5 版更改: open() 当标志具有值时始终创建新数据库 'n' .

在 3.8 版更改: 用标志打开的数据库 'r' 现在是只读的。用旗子打开 'r''w' 如果数据库不存在,则不再创建它。

除了 collections.abc.MutableMapping 类, dumbdbm 对象提供以下方法:

dumbdbm.sync()

同步磁盘目录和数据文件。此方法由 Shelve.sync() 方法。

dumbdbm.close()

关闭 dumbdbm 数据库。