dbm --- Unix "數(shù)據(jù)庫(kù)" 接口?

源代碼: Lib/dbm/__init__.py


dbm 是一種泛用接口,針對(duì)各種 DBM 數(shù)據(jù)庫(kù) --- 包括 dbm.gnudbm.ndbm。 如果未安裝這些模塊中的任何一種,則將使用 dbm.dumb 模塊中慢速但簡(jiǎn)單的實(shí)現(xiàn)。 還有一個(gè)適用于 Oracle Berkeley DB 的 第三方接口。

exception dbm.error?

一個(gè)元組,其中包含每個(gè)受支持的模塊可引發(fā)的異常,另外還有一個(gè)名為 dbm.error 的特殊異常作為第一項(xiàng) --- 后者最在引發(fā) dbm.error 時(shí)被使用。

dbm.whichdb(filename)?

此函數(shù)會(huì)猜測(cè)各種簡(jiǎn)單數(shù)據(jù)庫(kù)模塊中的哪一個(gè)是可用的 --- dbm.gnu, dbm.ndbm 還是 dbm.dumb --- 應(yīng)該被用來(lái)打開(kāi)給定的文件。

返回下列值中的一個(gè):如果文件由于不可讀或不存在而無(wú)法打開(kāi)則返回 None;如果文件的格式無(wú)法猜測(cè)則返回空字符串 ('');或是包含所需模塊名稱的字符串,例如 'dbm.ndbm''dbm.gnu'

在 3.11 版更改: Accepts path-like object for filename.

dbm.open(file, flag='r', mode=0o666)?

打開(kāi)數(shù)據(jù)庫(kù)文件 file 并返回一個(gè)相應(yīng)的對(duì)象。

如果數(shù)據(jù)庫(kù)文件已存在,則使用 whichdb() 函數(shù)來(lái)確定其類型和要使用的適當(dāng)模塊;如果文件不存在,則會(huì)使用上述可導(dǎo)入模塊中的第一個(gè)。

可選的 flag 參數(shù)可以是:

含意

'r'

以只讀方式打開(kāi)現(xiàn)有數(shù)據(jù)庫(kù)(默認(rèn))

'w'

以讀寫方式打開(kāi)現(xiàn)有數(shù)據(jù)庫(kù)

'c'

以讀寫方式打開(kāi)數(shù)據(jù)庫(kù),如果不存在則創(chuàng)建它

'n'

始終創(chuàng)建一個(gè)新的空數(shù)據(jù)庫(kù),以讀寫方式打開(kāi)

可選的 mode 參數(shù)是文件的 Unix 模式,僅在要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)時(shí)才會(huì)被使用。 其默認(rèn)值為八進(jìn)制數(shù) 0o666 (并將被當(dāng)前的 umask 所修改)。

open() 所返回的對(duì)象支持與字典相同的基本功能;可以存儲(chǔ)、獲取和刪除鍵及其對(duì)應(yīng)的值,并可使用 in 運(yùn)算符和 keys() 方法,以及 get()setdefault()。

在 3.2 版更改: 現(xiàn)在 get()setdefault() 在所有數(shù)據(jù)庫(kù)模塊中均可用。

在 3.8 版更改: 從只讀數(shù)據(jù)庫(kù)中刪除鍵將引發(fā)數(shù)據(jù)庫(kù)模塊專屬的錯(cuò)誤而不是 KeyError

在 3.11 版更改: Accepts path-like object for file.

鍵和值總是被存儲(chǔ)為字節(jié)串。 這意味著當(dāng)使用字符串時(shí)它們會(huì)在被存儲(chǔ)之前隱式地轉(zhuǎn)換至默認(rèn)編碼格式。

這些對(duì)象也支持在 with 語(yǔ)句中使用,當(dāng)語(yǔ)句結(jié)束時(shí)將自動(dòng)關(guān)閉它們。

在 3.4 版更改: open() 所返回的對(duì)象添加了上下文管理協(xié)議的原生支持。

以下示例記錄了一些主機(jī)名和對(duì)應(yīng)的標(biāo)題,隨后將數(shù)據(jù)庫(kù)的內(nèi)容打印出來(lái)。:

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.

參見(jiàn)

模塊 shelve

存儲(chǔ)非字符串?dāng)?shù)據(jù)的持久化模塊。

以下部分描述了各個(gè)單獨(dú)的子模塊。

dbm.gnu --- GNU 對(duì) dbm 的重解析?

源代碼: Lib/dbm/gnu.py


此模塊與 dbm 模塊很相似,但是改用 GNU 庫(kù) gdbm 來(lái)提供某些附加功能。 請(qǐng)注意由 dbm.gnudbm.ndbm 所創(chuàng)建的文件格式是不兼容的。

dbm.gnu 模塊提供了對(duì) GNU DBM 庫(kù)的接口。 dbm.gnu.gdbm 對(duì)象的行為類似于映射(字典),區(qū)別在于其鍵和值總是會(huì)在存儲(chǔ)之前被轉(zhuǎn)換為字節(jié)串。 打印 gdbm 對(duì)象不會(huì)打印出鍵和值,并且 items()values() 等方法也不受支持。

exception dbm.gnu.error?

針對(duì) dbm.gnu 專屬錯(cuò)誤例如 I/O 錯(cuò)誤引發(fā)。 KeyError 的引發(fā)則針對(duì)一般映射錯(cuò)誤例如指定了不正確的鍵。

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

打開(kāi)一個(gè) gdbm 數(shù)據(jù)庫(kù)并返回 gdbm 對(duì)象。 filename 參數(shù)為數(shù)據(jù)庫(kù)文件名稱。

可選的 flag 參數(shù)可以是:

含意

'r'

以只讀方式打開(kāi)現(xiàn)有數(shù)據(jù)庫(kù)(默認(rèn))

'w'

以讀寫方式打開(kāi)現(xiàn)有數(shù)據(jù)庫(kù)

'c'

以讀寫方式打開(kāi)數(shù)據(jù)庫(kù),如果不存在則創(chuàng)建它

'n'

始終創(chuàng)建一個(gè)新的空數(shù)據(jù)庫(kù),以讀寫方式打開(kāi)

下列附加字符可被添加至旗標(biāo)以控制數(shù)據(jù)庫(kù)的打開(kāi)方式:

含意

'f'

以快速模式打開(kāi)數(shù)據(jù)庫(kù)。寫入數(shù)據(jù)庫(kù)將不會(huì)同步。

's'

同步模式。這將導(dǎo)致數(shù)據(jù)庫(kù)的更改立即寫入文件。

'u'

不要鎖定數(shù)據(jù)庫(kù)。

不是所有旗標(biāo)都可用于所有版本的 gdbm。 模塊常量 open_flags 為包含受支持旗標(biāo)字符的字符串。 如果指定了無(wú)效的旗標(biāo)則會(huì)引發(fā) error。

可選的 mode 參數(shù)是文件的 Unix 模式,僅在要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)時(shí)才會(huì)被使用。 其默認(rèn)值為八進(jìn)制數(shù) 0o666。

除了與字典類似的方法,gdbm 對(duì)象還有以下方法:

在 3.11 版更改: Accepts path-like object for filename.

gdbm.firstkey()?

使用此方法和 nextkey() 方法可以循環(huán)遍歷數(shù)據(jù)庫(kù)中的每個(gè)鍵。 遍歷的順序是按照 gdbm 的內(nèi)部哈希值,而不會(huì)根據(jù)鍵的值排序。 此方法將返回起始鍵。

gdbm.nextkey(key)?

在遍歷中返回 key 之后的的下一個(gè)鍵。 以下代碼將打印數(shù)據(jù)庫(kù) db 中的每個(gè)鍵,而不會(huì)在內(nèi)存中創(chuàng)建一個(gè)包含所有鍵的列表:

k = db.firstkey()
while k is not None:
    print(k)
    k = db.nextkey(k)
gdbm.reorganize()?

如果你進(jìn)行了大量刪除操作并且想要縮減 gdbm 文件所使用的空間,此例程將可重新組織數(shù)據(jù)庫(kù)。 除非使用此重組功能否則 gdbm 對(duì)象不會(huì)縮減數(shù)據(jù)庫(kù)文件大??;在其他情況下,被刪除的文件空間將會(huì)保留并在添加新的 (鍵, 值) 對(duì)時(shí)被重用。

gdbm.sync()?

當(dāng)以快速模式打開(kāi)數(shù)據(jù)庫(kù)時(shí),此方法會(huì)將任何未寫入數(shù)據(jù)強(qiáng)制寫入磁盤。

gdbm.close()?

關(guān)閉 gdbm 數(shù)據(jù)庫(kù)。

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

源代碼: Lib/dbm/ndbm.py


dbm.ndbm 模塊提供了對(duì) Unix "(n)dbm" 庫(kù)的接口。 Dbm 對(duì)象的行為類似于映射(字典),區(qū)別在于其鍵和值總是被存儲(chǔ)為字節(jié)串。 打印 dbm 對(duì)象不會(huì)打印出鍵和值,并且 items()values() 等方法也不受支持。

此模塊可與 "經(jīng)典classic" ndbm 接口或 GNU GDBM 兼容接口一同使用。 在 Unix 上,configure 腳本將嘗試定位適當(dāng)?shù)念^文件來(lái)簡(jiǎn)化此模塊的構(gòu)建。

exception dbm.ndbm.error?

針對(duì) dbm.ndbm 專屬錯(cuò)誤例如 I/O 錯(cuò)誤引發(fā)。 KeyError 的引發(fā)則針對(duì)一般映射錯(cuò)誤例如指定了不正確的鍵。

dbm.ndbm.library?

所使用的 ndbm 實(shí)現(xiàn)庫(kù)的名稱。

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

打開(kāi)一個(gè) dbm 數(shù)據(jù)庫(kù)并返回 ndbm 對(duì)象。 filename 參數(shù)為數(shù)據(jù)庫(kù)文件名稱(不帶 .dir.pag 擴(kuò)展名)。

可選的 flag 參數(shù)必須是下列值之一:

含意

'r'

以只讀方式打開(kāi)現(xiàn)有數(shù)據(jù)庫(kù)(默認(rèn))

'w'

以讀寫方式打開(kāi)現(xiàn)有數(shù)據(jù)庫(kù)

'c'

以讀寫方式打開(kāi)數(shù)據(jù)庫(kù),如果不存在則創(chuàng)建它

'n'

始終創(chuàng)建一個(gè)新的空數(shù)據(jù)庫(kù),以讀寫方式打開(kāi)

可選的 mode 參數(shù)是文件的 Unix 模式,僅在要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)時(shí)才會(huì)被使用。 其默認(rèn)值為八進(jìn)制數(shù) 0o666 (并將被當(dāng)前的 umask 所修改)。

除了與字典類似的方法,ndbm 對(duì)象還有以下方法:

在 3.11 版更改: Accepts path-like object for filename.

ndbm.close()?

關(guān)閉 ndbm 數(shù)據(jù)庫(kù)。

dbm.dumb --- 便攜式 DBM 實(shí)現(xiàn)?

源代碼: Lib/dbm/dumb.py

備注

dbm.dumb 模塊的目的是在更健壯的模塊不可用時(shí)作為 dbm 模塊的最終回退項(xiàng)。 dbm.dumb 不是為高速運(yùn)行而編寫的,也不像其他數(shù)據(jù)庫(kù)模塊一樣被經(jīng)常使用。


dbm.dumb 模塊提供了一個(gè)完全以 Python 編寫的持久化字典類接口。 不同于 dbm.gnu 等其他模塊,它不需要外部庫(kù)。 與其他持久化映射一樣,它的鍵和值也總是被存儲(chǔ)為字節(jié)串。

該模塊定義以下內(nèi)容:

exception dbm.dumb.error?

針對(duì) dbm.dumb 專屬錯(cuò)誤例如 I/O 錯(cuò)誤引發(fā)。 KeyError 的引發(fā)則針對(duì)一般映射例如指定了不正確的鍵。

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

打開(kāi)一個(gè) dumbdbm 數(shù)據(jù)庫(kù)并返回 dumbdbm 對(duì)象。 filename 參數(shù)為數(shù)據(jù)庫(kù)文件的主名稱(不帶任何特定擴(kuò)展名)。 創(chuàng)建一個(gè) dumbdbm 數(shù)據(jù)庫(kù)時(shí)將創(chuàng)建多個(gè)帶有 .dat.dir 擴(kuò)展名的文件。

可選的 flag 參數(shù)可以是:

含意

'r'

以只讀方式打開(kāi)現(xiàn)有數(shù)據(jù)庫(kù)(默認(rèn))

'w'

以讀寫方式打開(kāi)現(xiàn)有數(shù)據(jù)庫(kù)

'c'

以讀寫方式打開(kāi)數(shù)據(jù)庫(kù),如果不存在則創(chuàng)建它

'n'

始終創(chuàng)建一個(gè)新的空數(shù)據(jù)庫(kù),以讀寫方式打開(kāi)

可選的 mode 參數(shù)是文件的 Unix 模式,僅在要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)時(shí)才會(huì)被使用。 其默認(rèn)值為八進(jìn)制數(shù) 0o666 (并將被當(dāng)前的 umask 所修改)。

警告

當(dāng)載入包含足夠巨大/復(fù)雜條目的數(shù)據(jù)庫(kù)時(shí)有可能導(dǎo)致 Python 解釋器的崩潰,這是由于 Python AST 編譯器有棧深度限制。

在 3.5 版更改: open() 在 flag 值為 'n' 時(shí)將總是創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)。

在 3.8 版更改: 附帶 'r' 旗標(biāo)打開(kāi)的數(shù)據(jù)庫(kù)現(xiàn)在將是只讀的。 附帶 'r''w' 旗標(biāo)的打開(kāi)操作不會(huì)再創(chuàng)建數(shù)據(jù)庫(kù)。

在 3.11 版更改: Accepts path-like object for filename.

除了 collections.abc.MutableMapping 類所提供的方法,dumbdbm 對(duì)象還提供了以下方法:

dumbdbm.sync()?

同步磁盤上的目錄和數(shù)據(jù)文件。 此方法會(huì)由 Shelve.sync() 方法來(lái)調(diào)用。

dumbdbm.close()?

關(guān)閉 dumbdbm 數(shù)據(jù)庫(kù)。