詳解Python中數(shù)據(jù)庫管理模塊shelve和dbm的應(yīng)用
作為常用的 python 自帶數(shù)據(jù)庫管理模塊,shelve 和 dbm 都是非常方便的對象持久化存儲和檢索工具,并且這兩個模塊在使用上具有許多不同的特點。
本文將從 shelve 和 dbm 的介紹、用法、優(yōu)勢以及不同點等方面進行詳細(xì)闡述和比較,希望能夠幫助讀者更好地理解和使用這兩個數(shù)據(jù)庫管理模塊。
shelve 和 dbm 的介紹
shelve 和 dbm 都是 python 自帶的數(shù)據(jù)庫管理模塊,可以用于持久化存儲和檢索 python 中的對象。
雖然這兩個模塊的本質(zhì)都是建立 key-value 對應(yīng)關(guān)系的數(shù)據(jù)庫,但 shelve 模塊更像是 python 中的持久化字典。
支持存儲 python 中的幾乎所有對象(如整型、字符串、字典、列表等),并且具有一定的數(shù)據(jù)壓縮功能。
而 dbm 則僅支持字符串類型的鍵和值,并且它們會以二進制文件的方式存儲在硬盤上。
shelve 需要使用 pickle 模塊對 python 對象進行序列化和反序列化,而 dbm 則直接使用字節(jié)序列進行存儲。
因此,如果需要實現(xiàn) python 對象的持久化存儲和檢索,建議使用 shelve;否則,如果采用 dbm 更為合適。
不僅如此,shelve 和 dbm 在使用上還存在許多區(qū)別,例如 shelve 具有鎖支持。
而 dbm 不支持鎖操作,這意味著在一些數(shù)據(jù)安全性較高的場景下,shelve 更為適合。
接下來,我們將重點介紹 shelve 和 dbm 的用法、優(yōu)勢以及不同點等方面。
shelve 的用法
使用 shelve 模塊建立和打開數(shù)據(jù)庫非常簡單,我們只需要執(zhí)行如下代碼:
import shelve db = shelve.open('mydata.db')
這里,我們建立了一個名字為 mydata.db 的數(shù)據(jù)庫文件,并使用 shelve 模塊中的 open() 方法建立了一個 shelve 對象 db。
此時,我們可以使用 python 字典的方式來存儲和讀取對象:
import shelve db = shelve.open('mydata.db') db['key1'] = 'value1' db['key2'] = 2 db['key3'] = {'name': 'Jack', 'age': 25} print(db['key1']) # 輸出 value1 print(db['key2']) # 輸出 2 print(db['key3']) # 輸出 {'name': 'Jack', 'age': 25}
可以看到,我們成功地將不同類型的 python 對象存儲到了 shelve 數(shù)據(jù)庫中,并且通過相應(yīng)的鍵名完成了對其的讀取操作。
需要注意的是,在使用 shelve 存儲自定義對象時,通過 setstate__() 和 __getstate() 方法來實現(xiàn)對象的序列化和反序列化。
shelve 對象也可以使用 python 的 with 語句進行上下文管理:
import shelve with shelve.open('mydata.db') as db: db['key4'] = {'name': 'Tom', 'age': 22} print(db['key4']) # 輸出 KeyError: 'key4'
使用 with 語句可以確保在代碼塊結(jié)束時,shelve 對象會被關(guān)閉,并將其所包含的對象保存到硬盤上。
此時,需要注意的是,由于已經(jīng)關(guān)閉了 shelve 對象,無法再直接使用 db 對象訪問鍵值 key4。
最后,我們需要手動關(guān)閉 shelve 數(shù)據(jù)庫:
import shelve db = shelve.open('mydata.db') # 操作數(shù)據(jù)庫 db.close()
dbm 的用法
與 shelve 類似,使用 dbm 模塊建立和打開數(shù)據(jù)庫也非常簡單:
import dbm db = dbm.open('mydata.db', 'c')
這里,我們建立了一個名字為 mydata.db 的數(shù)據(jù)庫文件,并使用 dbm 的 open() 方法建立了一個 dbm 對象 db。
需要注意的是,與 shelve 不同的是,dbm 只支持字符串類型的鍵和值,并且需要用字節(jié)串的形式作為鍵和值。
我們可以使用字節(jié)串來存儲字符串:
import dbm db = dbm.open('mydata.db', 'c') db[b'key1'] = b'value1' db[b'key2'] = b'value2' print(db[b'key1']) # 輸出 value1 print(db[b'key2']) # 輸出 value2
需要注意的是,我們使用了字節(jié)串作為鍵和值,以便在存儲和讀取時使用。
如果要將 Unicode 字符串存儲到 dbm 中,需要使用 encode() 方法將其編碼為字節(jié)串,例如:
import dbm db = dbm.open('mydata.db', 'c') db[b'key3'] = '這是一個字符串'.encode('utf-8') print(db[b'key3'].decode('utf-8')) # 輸出 這是一個字符串
與 shelve 一樣,dbm 對象也可以使用 python 的 with 語句進行上下文管理:
import dbm with dbm.open('mydata.db', 'c') as db: db[b'key4'] = b'value4' print(db[b'key4']) # 輸出 KeyError: b'key4'
需要注意的是,在使用 with 語句時,db 對象也會在離開代碼塊時自動關(guān)閉。
最后,我們需要手動關(guān)閉 dbm 數(shù)據(jù)庫:
import dbm db = dbm.open('mydata.db', 'c') # 操作數(shù)據(jù)庫 db.close()
shelve 和 dbm 的優(yōu)勢
shelve 和 dbm 模塊的優(yōu)勢在于它們非常方便,無需安裝任何第三方庫即可使用。
它們的 API 與 python 內(nèi)置的類型非常相似,因此使用起來非常簡單。
此外,它們對于小型數(shù)據(jù)存儲和檢索非常高效,并且具有跨平臺的優(yōu)勢。
盡管這些特點不一定具有普適性,但在許多程序中都是優(yōu)秀且合理的選擇。
此外,shelve 模塊具有數(shù)據(jù)壓縮的功能,可以在一定程度上提高存儲效率。
這是由于 shelve 會將 python 對象轉(zhuǎn)換為字符串,并壓縮這些字符串,從而減小數(shù)據(jù)文件的大小。
因此,如果需要長期存儲比較多的數(shù)據(jù),使用 shelve 可以使得磁盤占用量更小,并且可以加速數(shù)據(jù)存儲和檢索的速度。
shelve 和 dbm 的不同點
shelve 和 dbm 在使用上具有許多不同點。下面我們將重點討論它們的幾種不同之處。
1. 數(shù)據(jù)類型不同
最引人注目的是,shelve 和 dbm 支持的數(shù)據(jù)類型不同。
shelve 可以存儲任意的 python 對象,包括列表、字典、元組、自定義對象等,而 dbm 僅支持字節(jié)串類型的鍵和值。
具體來說,對于數(shù)據(jù)類型的限制,shelve 要比 dbm 更小。
這取決于具體應(yīng)用需求,但是如果需要存儲 python 對象,則可以使用 shelve,否則可以使用 dbm。
2. 支持不同的鎖
shelve 具有鎖支持,這意味著它可以被多個進程或線程同時訪問,可以有效避免并發(fā)沖突的情況。
相比之下,dbm 不支持鎖操作,這意味著在訪問 dbm 數(shù)據(jù)庫時需要自己實現(xiàn)自己的鎖邏輯,以確保并發(fā)訪問的正確性。
3. 磁盤空間占用不同
盡管 shelve 和 dbm 都是將數(shù)據(jù)存儲在硬盤上,但是占用的磁盤空間大小卻有所不同。
通常情況下,shelve 會壓縮數(shù)據(jù)并存儲它們,因此在許多情況下,shelve 會占用更少的磁盤空間。
而 dbm 不需要進行壓縮操作,因此當(dāng)存儲的數(shù)據(jù)量較小時,dbm 相對于 shelve 更為節(jié)省磁盤空間。
總結(jié)
在本文中,我們詳細(xì)介紹了 shelve 和 dbm 兩個 python 自帶的數(shù)據(jù)庫管理模塊,包括它們的介紹、用法、優(yōu)勢以及不同點等。
雖然 shelve 和 dbm 的共同點是都能實現(xiàn)簡單的持久化存儲和檢索功能。
但是這兩個模塊在存儲和檢索的數(shù)據(jù)類型、支持鎖的程度以及磁盤空間占用等方面存在許多不同點。
在選擇具體的模塊時,需要結(jié)合實際情況來進行選擇。
到此這篇關(guān)于詳解Python中數(shù)據(jù)庫管理模塊shelve和dbm的應(yīng)用的文章就介紹到這了,更多相關(guān)Python shelve dbm內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
tensorflow建立一個簡單的神經(jīng)網(wǎng)絡(luò)的方法
本篇文章主要介紹了tensorflow建立一個簡單的神經(jīng)網(wǎng)絡(luò)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02python中str內(nèi)置函數(shù)用法總結(jié)
在本篇文章里小編給大家整理了一篇關(guān)于python中str內(nèi)置函數(shù)用法總結(jié)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2020-12-12詳解python讀取matlab數(shù)據(jù)(.mat文件)
本文主要介紹了python讀取matlab數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12基于Tensorflow批量數(shù)據(jù)的輸入實現(xiàn)方式
今天小編就為大家分享一篇基于Tensorflow批量數(shù)據(jù)的輸入實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02