dbm
--- Unix "數據庫" 接口?
源代碼: Lib/dbm/__init__.py
dbm
是一種泛用接口,針對各種 DBM 數據庫 --- 包括 dbm.gnu
或 dbm.ndbm
。 如果未安裝這些模塊中的任何一種,則將使用 dbm.dumb
模塊中慢速但簡(jiǎn)單的實(shí)現。 還有一個(gè)適用于 Oracle Berkeley DB 的 第三方接口。
- exception dbm.error?
一個(gè)元組,其中包含每個(gè)受支持的模塊可引發(fā)的異常,另外還有一個(gè)名為
dbm.error
的特殊異常作為第一項 --- 后者最在引發(fā)dbm.error
時(shí)被使用。
- dbm.whichdb(filename)?
此函數會(huì )猜測各種簡(jiǎn)單數據庫模塊中的哪一個(gè)是可用的 ---
dbm.gnu
,dbm.ndbm
還是dbm.dumb
--- 應該被用來(lái)打開(kāi)給定的文件。返回下列值中的一個(gè):如果文件由于不可讀或不存在而無(wú)法打開(kāi)則返回
None
;如果文件的格式無(wú)法猜測則返回空字符串 (''
);或是包含所需模塊名稱(chēng)的字符串,例如'dbm.ndbm'
或'dbm.gnu'
。
在 3.11 版更改: Accepts path-like object for filename.
- dbm.open(file, flag='r', mode=0o666)?
打開(kāi)數據庫文件 file 并返回一個(gè)相應的對象。
如果數據庫文件已存在,則使用
whichdb()
函數來(lái)確定其類(lèi)型和要使用的適當模塊;如果文件不存在,則會(huì )使用上述可導入模塊中的第一個(gè)。可選的 flag 參數可以是:
值
含意
'r'
以只讀方式打開(kāi)現有數據庫(默認)
'w'
以讀寫(xiě)方式打開(kāi)現有數據庫
'c'
以讀寫(xiě)方式打開(kāi)數據庫,如果不存在則創(chuàng )建它
'n'
始終創(chuàng )建一個(gè)新的空數據庫,以讀寫(xiě)方式打開(kāi)
可選的 mode 參數是文件的 Unix 模式,僅在要創(chuàng )建數據庫時(shí)才會(huì )被使用。 其默認值為八進(jìn)制數
0o666
(并將被當前的 umask 所修改)。
open()
所返回的對象支持與字典相同的基本功能;可以存儲、獲取和刪除鍵及其對應的值,并可使用 in
運算符和 keys()
方法,以及 get()
和 setdefault()
。
在 3.2 版更改: 現在 get()
和 setdefault()
在所有數據庫模塊中均可用。
在 3.8 版更改: 從只讀數據庫中刪除鍵將引發(fā)數據庫模塊專(zhuān)屬的錯誤而不是 KeyError
。
在 3.11 版更改: Accepts path-like object for file.
鍵和值總是被存儲為字節串。 這意味著(zhù)當使用字符串時(shí)它們會(huì )在被存儲之前隱式地轉換至默認編碼格式。
這些對象也支持在 with
語(yǔ)句中使用,當語(yǔ)句結束時(shí)將自動(dòng)關(guān)閉它們。
在 3.4 版更改: 向 open()
所返回的對象添加了上下文管理協(xié)議的原生支持。
以下示例記錄了一些主機名和對應的標題,隨后將數據庫的內容打印出來(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
存儲非字符串數據的持久化模塊。
以下部分描述了各個(gè)單獨的子模塊。
dbm.gnu
--- GNU 對 dbm 的重解析?
源代碼: Lib/dbm/gnu.py
此模塊與 dbm
模塊很相似,但是改用 GNU 庫 gdbm
來(lái)提供某些附加功能。 請注意由 dbm.gnu
與 dbm.ndbm
所創(chuàng )建的文件格式是不兼容的。
dbm.gnu
模塊提供了對 GNU DBM 庫的接口。 dbm.gnu.gdbm
對象的行為類(lèi)似于映射(字典),區別在于其鍵和值總是會(huì )在存儲之前被轉換為字節串。 打印 gdbm
對象不會(huì )打印出鍵和值,并且 items()
和 values()
等方法也不受支持。
- exception dbm.gnu.error?
針對
dbm.gnu
專(zhuān)屬錯誤例如 I/O 錯誤引發(fā)。KeyError
的引發(fā)則針對一般映射錯誤例如指定了不正確的鍵。
- dbm.gnu.open(filename[, flag[, mode]])?
打開(kāi)一個(gè)
gdbm
數據庫并返回gdbm
對象。 filename 參數為數據庫文件名稱(chēng)。可選的 flag 參數可以是:
值
含意
'r'
以只讀方式打開(kāi)現有數據庫(默認)
'w'
以讀寫(xiě)方式打開(kāi)現有數據庫
'c'
以讀寫(xiě)方式打開(kāi)數據庫,如果不存在則創(chuàng )建它
'n'
始終創(chuàng )建一個(gè)新的空數據庫,以讀寫(xiě)方式打開(kāi)
下列附加字符可被添加至旗標以控制數據庫的打開(kāi)方式:
值
含意
'f'
以快速模式打開(kāi)數據庫。寫(xiě)入數據庫將不會(huì )同步。
's'
同步模式。這將導致數據庫的更改立即寫(xiě)入文件。
'u'
不要鎖定數據庫。
不是所有旗標都可用于所有版本的
gdbm
。 模塊常量open_flags
為包含受支持旗標字符的字符串。 如果指定了無(wú)效的旗標則會(huì )引發(fā)error
。可選的 mode 參數是文件的 Unix 模式,僅在要創(chuàng )建數據庫時(shí)才會(huì )被使用。 其默認值為八進(jìn)制數
0o666
。除了與字典類(lèi)似的方法,
gdbm
對象還有以下方法:在 3.11 版更改: Accepts path-like object for filename.
- gdbm.firstkey()?
使用此方法和
nextkey()
方法可以循環(huán)遍歷數據庫中的每個(gè)鍵。 遍歷的順序是按照gdbm
的內部哈希值,而不會(huì )根據鍵的值排序。 此方法將返回起始鍵。
- gdbm.nextkey(key)?
在遍歷中返回 key 之后的的下一個(gè)鍵。 以下代碼將打印數據庫
db
中的每個(gè)鍵,而不會(huì )在內存中創(chuàng )建一個(gè)包含所有鍵的列表:k = db.firstkey() while k is not None: print(k) k = db.nextkey(k)
- gdbm.reorganize()?
如果你進(jìn)行了大量刪除操作并且想要縮減
gdbm
文件所使用的空間,此例程將可重新組織數據庫。 除非使用此重組功能否則gdbm
對象不會(huì )縮減數據庫文件大??;在其他情況下,被刪除的文件空間將會(huì )保留并在添加新的 (鍵, 值) 對時(shí)被重用。
- gdbm.sync()?
當以快速模式打開(kāi)數據庫時(shí),此方法會(huì )將任何未寫(xiě)入數據強制寫(xiě)入磁盤(pán)。
- gdbm.close()?
關(guān)閉
gdbm
數據庫。
dbm.ndbm
--- 基于 ndbm 的接口?
源代碼: Lib/dbm/ndbm.py
dbm.ndbm
模塊提供了對 Unix "(n)dbm" 庫的接口。 Dbm 對象的行為類(lèi)似于映射(字典),區別在于其鍵和值總是被存儲為字節串。 打印 dbm
對象不會(huì )打印出鍵和值,并且 items()
和 values()
等方法也不受支持。
此模塊可與 "經(jīng)典classic" ndbm 接口或 GNU GDBM 兼容接口一同使用。 在 Unix 上,configure 腳本將嘗試定位適當的頭文件來(lái)簡(jiǎn)化此模塊的構建。
- exception dbm.ndbm.error?
針對
dbm.ndbm
專(zhuān)屬錯誤例如 I/O 錯誤引發(fā)。KeyError
的引發(fā)則針對一般映射錯誤例如指定了不正確的鍵。
- dbm.ndbm.library?
所使用的
ndbm
實(shí)現庫的名稱(chēng)。
- dbm.ndbm.open(filename[, flag[, mode]])?
打開(kāi)一個(gè) dbm 數據庫并返回
ndbm
對象。 filename 參數為數據庫文件名稱(chēng)(不帶.dir
或.pag
擴展名)。可選的 flag 參數必須是下列值之一:
值
含意
'r'
以只讀方式打開(kāi)現有數據庫(默認)
'w'
以讀寫(xiě)方式打開(kāi)現有數據庫
'c'
以讀寫(xiě)方式打開(kāi)數據庫,如果不存在則創(chuàng )建它
'n'
始終創(chuàng )建一個(gè)新的空數據庫,以讀寫(xiě)方式打開(kāi)
可選的 mode 參數是文件的 Unix 模式,僅在要創(chuàng )建數據庫時(shí)才會(huì )被使用。 其默認值為八進(jìn)制數
0o666
(并將被當前的 umask 所修改)。除了與字典類(lèi)似的方法,
ndbm
對象還有以下方法:在 3.11 版更改: Accepts path-like object for filename.
- ndbm.close()?
關(guān)閉
ndbm
數據庫。
dbm.dumb
--- 便攜式 DBM 實(shí)現?
源代碼: Lib/dbm/dumb.py
備注
dbm.dumb
模塊的目的是在更健壯的模塊不可用時(shí)作為 dbm
模塊的最終回退項。 dbm.dumb
不是為高速運行而編寫(xiě)的,也不像其他數據庫模塊一樣被經(jīng)常使用。
dbm.dumb
模塊提供了一個(gè)完全以 Python 編寫(xiě)的持久化字典類(lèi)接口。 不同于 dbm.gnu
等其他模塊,它不需要外部庫。 與其他持久化映射一樣,它的鍵和值也總是被存儲為字節串。
該模塊定義以下內容:
- exception dbm.dumb.error?
針對
dbm.dumb
專(zhuān)屬錯誤例如 I/O 錯誤引發(fā)。KeyError
的引發(fā)則針對一般映射例如指定了不正確的鍵。
- dbm.dumb.open(filename[, flag[, mode]])?
打開(kāi)一個(gè)
dumbdbm
數據庫并返回 dumbdbm 對象。 filename 參數為數據庫文件的主名稱(chēng)(不帶任何特定擴展名)。 創(chuàng )建一個(gè) dumbdbm 數據庫時(shí)將創(chuàng )建多個(gè)帶有.dat
和.dir
擴展名的文件。可選的 flag 參數可以是:
值
含意
'r'
以只讀方式打開(kāi)現有數據庫(默認)
'w'
以讀寫(xiě)方式打開(kāi)現有數據庫
'c'
以讀寫(xiě)方式打開(kāi)數據庫,如果不存在則創(chuàng )建它
'n'
始終創(chuàng )建一個(gè)新的空數據庫,以讀寫(xiě)方式打開(kāi)
可選的 mode 參數是文件的 Unix 模式,僅在要創(chuàng )建數據庫時(shí)才會(huì )被使用。 其默認值為八進(jìn)制數
0o666
(并將被當前的 umask 所修改)。警告
當載入包含足夠巨大/復雜條目的數據庫時(shí)有可能導致 Python 解釋器的崩潰,這是由于 Python AST 編譯器有棧深度限制。
在 3.5 版更改:
open()
在 flag 值為'n'
時(shí)將總是創(chuàng )建一個(gè)新的數據庫。在 3.8 版更改: 附帶
'r'
旗標打開(kāi)的數據庫現在將是只讀的。 附帶'r'
和'w'
旗標的打開(kāi)操作不會(huì )再創(chuàng )建數據庫。在 3.11 版更改: Accepts path-like object for filename.
除了
collections.abc.MutableMapping
類(lèi)所提供的方法,dumbdbm
對象還提供了以下方法:- dumbdbm.sync()?
同步磁盤(pán)上的目錄和數據文件。 此方法會(huì )由
Shelve.sync()
方法來(lái)調用。
- dumbdbm.close()?
關(guān)閉
dumbdbm
數據庫。