Python-shelve庫

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()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容