python观察日志(part9)--数据库与pickle模块
學(xué)習(xí)筆記,有錯必糾
數(shù)據(jù)庫
數(shù)據(jù)庫是一個有組織的用于存儲數(shù)據(jù)的文件,許多數(shù)據(jù)庫都像字典一樣組織數(shù)據(jù),因為它也將鍵映射到值上,數(shù)據(jù)庫和字典之間最大的區(qū)別是數(shù)據(jù)庫是保存在磁盤上的(或者其他永久存儲上),所以當(dāng)程序結(jié)束時它也能持續(xù)存在。
- dbm模塊
模塊dbm提供了接口用于創(chuàng)建和更新數(shù)據(jù)庫文件。
import dbm db = dbm.open('testdatabase', 'c')在dbm.open方法中,若把參數(shù)設(shè)置為"c",則意味著如果數(shù)據(jù)庫不存在,則創(chuàng)建該數(shù)據(jù)庫。該方法會返回一個數(shù)據(jù)庫對象。
當(dāng)創(chuàng)建一個新項時,dbm會更新數(shù)據(jù)庫文件,當(dāng)訪問數(shù)據(jù)庫中的一項時,dbm會讀取文件:
In [41]: import dbm...: ...: db = dbm.open('testdatabase', 'c')...: db['Bunny.png'] = 'Photo of Huang.'...: print(db['Bunny.png']) b'Photo of Huang.'我們看到,輸出的結(jié)果以b開頭,是一個字節(jié)序列。
如果對一個已經(jīng)存在的鍵賦值,dbm會替換舊值:
In [42]: db['Bunny.png'] = 'Photo of Xiao Huang.'...: print(db['Bunny.png']) b'Photo of Xiao Huang.'和其他文件一樣,當(dāng)操作結(jié)束時,我們需要關(guān)閉數(shù)據(jù)庫:
db.close()dbm的限制之一是鍵和值都必須是字符串或字節(jié),如果嘗試使用其他類型,則會報錯:
In [46]: db['test'] = 10 TypeError: values must be bytes or strings這時,pickle模塊就可以幫上忙了!
pickle模塊
pickle模塊實現(xiàn)了用于序列化和反序列化Python對象結(jié)構(gòu)的二進制協(xié)議。pickle模塊可以將python中幾乎所有的數(shù)據(jù)類型(列表,字典,集合,類等)進行序列化。
我在網(wǎng)上查了一下關(guān)于序列化和反序列化的定義
解釋1:
序列化 (Serialization)是將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程。 在序列化期間,對象將其當(dāng)前狀態(tài)寫入到臨時或持久性存儲區(qū)。 以后,可以通過從存儲區(qū)中讀取或反序列化對象的狀態(tài),重新創(chuàng)建該對象。嗯,這個解釋還是挺好理解的。我們再以JAVA為例,看一下對于序列化和反序列化的解釋。
解釋2:
Java序列化就是指把Java對象轉(zhuǎn)換為字節(jié)序列的過程 Java反序列化就是指把字節(jié)序列恢復(fù)為Java對象的過程感覺在python中序列化和反序列化的應(yīng)用和JAVA很像鴨!
通過下面的實驗,我們可以看到,python中利用pickle.dumps函數(shù)對列表進行序列化,可以得到字節(jié)數(shù)據(jù);再利用pickle.loads反序列化,可以重新得到列表。
- dumps與loads
pickle.dumps接收一個對象作為參數(shù),并返回它的字節(jié)串形式:
In [58]: import pickle...: ...: t1 = [1, 2, 3]...: s = pickle.dumps(t1)...: print(s)...: print(type(s)) b'\x80\x03]q\x00(K\x01K\x02K\x03e.' <class 'bytes'>我們還可以使用pickle.loads重新構(gòu)造對象:
import picklet1 = [1, 2, 3] s = pickle.dumps(t1) t2 = pickle.loads(s) print(t2)print('值相同么:', t1 == t2) print('是同一個對象么', t1 is t2)輸出結(jié)果:
[1, 2, 3] 值相同么: True 是同一個對象么 False利用pickle模塊,我們向數(shù)據(jù)庫中存入列表:
import dbm import pickledb = dbm.open('testdatabase', 'c')t = [1, 2, 3] s = pickle.dumps(t) db['list01'] = s print(db['list01'])db.close()輸出結(jié)果:
b'\x80\x03]q\x00(K\x01K\x02K\x03e.'perfect!
總結(jié)
以上是生活随笔為你收集整理的python观察日志(part9)--数据库与pickle模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: word里连续使用格式刷小技巧
- 下一篇: TP-Link TL-WDR8600 无