Python-shelve庫
shelve是python中用來持久化存儲的模塊,類似于一個key-value的數(shù)據(jù)庫,但是這里的value不限定類型,可以是python中任意的數(shù)據(jù)類型,也可以是自己定義的數(shù)據(jù)類型。
1.創(chuàng)建shelve
使用Shelve庫:import shelve
創(chuàng)建:調(diào)用sheleve.open()方法來創(chuàng)建存儲。
shelve.open()方法:
# 傳入的字符串為文件名,不需要加后綴(windows會自動生成,linux不會)
# open還有一個參數(shù)writeback,默認(rèn)為False,如果指定為TRUE,則會在數(shù)據(jù)發(fā)生變化時候回寫,
# 消耗內(nèi)存大,一般設(shè)置為False。
with shelve.open("filename") as db:
pass
2.使用shelve
在打開shelve后,使用方式很簡單,類似于操作一個字典。
import shelve
# 創(chuàng)建
with shelve.open("test") as db:
# 添加
db['add'] = {'A':'1','B':'2'}
# 查看
print(db['add'])
# 刪除
del db['add']
# 判斷是否含有key
if 'add' in db:
print("Yes")
else:
print("No")
# 關(guān)閉shelve
db.close()
3.可變對象的值更新問題
? 通常情況下,db[key]返回的是一個數(shù)據(jù)類型的復(fù)制體,所以在處理可變對象時候需要特別注意:從shelve中取出的可變對象,在內(nèi)存中發(fā)生更改時,shelve是無法知道的,也不會自動的把更改寫回到文件(除非參數(shù)writeback設(shè)置為True,如果是這樣,若數(shù)據(jù)較大時會消耗大量內(nèi)存)。
比如,如果db[key]是一個列表,添加一個元素:db[key].append(anitem),這樣子是不會修改到文件中的db[key]本身的,這樣子的append是不會起效的。
添加一個元素到db[key]并且能起效應(yīng)該是這樣子(先讀取在臨時變量,再修改,最后寫入):
data = db[key] # 讀取db[key]保存在data
data.append(anitem) # 添加一個元素
db[key] = data # 把data寫入
也可以使用update方法,也相當(dāng)于是賦值
db.update({'add':{'A':'a','B':'b','C':'c'}}) # update({key:value})
總結(jié):對于可變對象,只有在對存儲的對象做了賦值的操作,才會修改到文件,才屬于真正的存儲起來。
import shelve
# 創(chuàng)建
with shelve.open("test") as db:
#database = shelve.open("test")
# 添加
db['add'] = {'A':'1','B':'2'}
# 查看
print(db['add'])
# 不會改變,結(jié)果還是{'A':'1','B':'2'}
db['add']['A'] = 'a'
print(db['add'])
# 改變內(nèi)容
data = db['add']
data['C'] = '3'
db['add'] = data
print(db['add'])
# 更新內(nèi)容 update
db.update({'add':{'A':'a','B':'b','C':'c'}})
print(db['add'])
db.close()