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