2017-05-26

Python 套件 - 簡易資料庫 dbm 與醃漬工具 pickle

dbm

dbm 和 dict 很像,都是用 key-value pair。
import dbm

# c 表示有則用,沒有則新增
# 在目前工作目錄產生 foods.bak、foods.dat 與 foods.dir 三個檔案
db = dbm.open('foods', 'c')

# 新增一筆資料
db['apple'] = '蘋果' # insert

# value 為 bytes 物件,要 decode 成字串
print(db['apple']) # b'\xe8\x98\x8b\xe6\x9e\x9c',bytes 物件
print(db['apple'].decode('utf-8')) # 蘋果

# 用已存在的 key 表示更新
db['apple'] = '小蘋果' # update

# 用完要關
db.close() 
dbm 的 key 與 value 都必須是字串或是 bytes 物件。

import dbm
db = dbm.open('foods', 'c')
db['banana'] = '香蕉'
db['durian'] = '榴槤'
# db[86] = '芭樂' # keys must be bytes or strings
# db['basket'] = [ 'Pear', 'Tomato'] # values must be bytes or strings
db.close() 
dbm 沒有 keys() 與 items(),但可以用 for-in,只是透過 for-in 拿到的 key 與 value 都是 bytes 物件。
import dbm
db = dbm.open('foods', 'c')
for key in db:
    print('%s > %s' % (key.decode('utf-8'), db[key].decode('utf-8')))
    # apple > 小蘋果
    # banana > 香蕉
    # durian > 榴槤
db.close()

pickle

如果 value 只能是字串,那 dbm 就用處不大了,但可以透過另一個套件 pickle,將任意型別「醃漬」成 bytes 物件。
import dbm
import pickle

db = dbm.open('foods', 'c')

# dumps 表示 dump 成 string
db['basket'] = pickle.dumps([ 'Pear', 'Tomato'])
db.close()

db = dbm.open('foods', 'c')
print(db['basket']) # b'\x80\x03]q\...
# print(db['basket'].decode('utf-8')) # UnicodeDecodeError

# loads 表示 load string
print(pickle.loads(db['basket'])) # ['Pear', 'Tomato']
db.close()
從 pickle 還原的物件,已經不是原來那個物件(reference),是一個複製品。
import pickle
t1 = [ 'Pear', 'Tomato']
b = pickle.dumps(t1)
t2 = pickle.loads(b)
print(t1) # ['Pear', 'Tomato']
print(t2) # ['Pear', 'Tomato']
print(t1 == t2) # True
print(t1 is t2) # False
---
---
---

沒有留言:

張貼留言