Python 基礎 4 9 shelve模組

2022-05-17 04:33:58 字數 4703 閱讀 3574

shelve模組是乙個簡單的k,v將記憶體資料通過檔案持久化的模組,可以持久化任何pickle可支援的python資料格式

對pickle的封裝,允許你多次dump多次,load多次。所以該模組只能在python中使用

序列化:

import

shelve

f = shelve.open('

shelve_test

') #

開啟乙個檔案

names = ["

alex

", "

rain

", "

test"]

info = f["

names

"] = names #

持久化列表

f['info_dic

'] =info

f.close()

反序列化:

import

shelve

d = shelve.open('

shelve_test

') #

開啟乙個檔案

print(d['

names'])

print(d['

info_dic'])

#del d['test'] #還可以刪除

前面我們介紹了json和pickle,這裡再介紹乙個簡單好用的shelve持久化模組。

shelve模組以類似字典的方式將python物件持久化,它依賴於pickle模組,但比pickle用起來簡單。當我們寫程式的時候如果不想用關聯式資料庫那麼重量級的程式去儲存資料,可以簡單地使用shelve。shelve使用起來和字典類似,也是用key來訪問的,鍵為普通字串,值則可以是任何python資料型別,並且支援所有字典型別的操作。

shelve模組最主要的兩個方法:

shelve.open(filename, flag='c', protocol=none, writeback=false)

建立或開啟乙個shelve物件。

shelve.close()

同步並關閉shelve物件。

每次使用完畢,都必須確保shelve物件被安全關閉。同樣可以使用with語句。

with shelve.open('

spam

') as db:

db['eggs

'] = '

eggs

'

通過shelve.open()方法開啟乙個shelve物件後,就可以使用類似字典的方式操作這個物件,如下面的例子所示:

import

shelve

d = shelve.open(filename) #

開啟乙個shelve檔案

d[key] = data #

存入資料

data = d[key] #

獲取資料

del d[key] #

刪除某個鍵值對

flag = key in d #

判斷某個鍵是否在字典內

klist = list(d.keys()) #

列出所有的鍵

d.close() #

關閉shelve檔案

注意,這裡不用提供讀寫模式!shelve預設開啟方式就支援同時讀寫操作。

預設情況下,writeback=false,這時:

>>> import shelve

>>> d = shelve.open("d:\\1")

>>> d['list'] = [0, 1, 2] # 正常工作

>>> d['list']

[0, 1, 2]

>>> d['list'] # 無效!d['list']還是[0, 1, 2]!

[0, 1, 2]

怎麼辦呢?使用中間變數!

temp = d['list']             

d['list'] = temp # 再存回去

shelve在預設情況下是不會記錄對持久化物件的任何後續修改的!

如果我們想讓shelve去自動捕獲物件的變化,應該在開啟shelve檔案的時候將writeback引數設定為true。此時,shelve會將所有資料放到快取中,並接收後續對資料的修改操作。最後,當我們close()的時候,快取中所有的物件一次性寫回磁碟內。

writeback=true有優點也有缺點。優點是可以動態修改資料,並減少出錯的概率,讓物件的持久化對使用者更加的透明。但也有很大的缺點,在open()的時候會增加額外的記憶體消耗,並且當close()物件的時候會將快取中的每乙個細節都寫回到檔案系統,這也會帶來額外的等待時間和計算消耗,因為shelve沒有辦法知道快取中哪些物件修改了,哪些物件沒有修改,所有的物件都必須被寫入。

#

匯入包in [13]: import

shelve

#建立,開啟檔案

in [14]: d = shelve.open("

cmz"

)in [15]: ls

atm/ cmz data/ user_info.py*

#插入鍵值對 ---------------------------- 增加

in [21]: d['

root_info

'] =

in [22]: d['

cmz_info

'] =

in [23]: d['

luffy_info

'] =

#檢視有哪些鍵值對

in [28]: list(d.keys())

out[28]: ['

cmz_info

', '

luffy_info

', '

name

', '

root_info']

#獲取值

n [29]: d.get('

cmz_info

') --------------------- 查詢

out[29]:

in [30]: d.get('

name')

out[30]:

in [31]: d.get('

root_info

')['

quota']

out[31]: 15000in [32]: type(d.get('

root_info

')['

quota'])

out[32]: int

#刪除 ------------------------ 刪除

in [33]: list(d.keys())

out[33]: ['

cmz_info

', '

luffy_info

', '

name

', '

root_info']

in [35]: del d["

name"]

in [36]: list(d.keys())

out[36]: ['

cmz_info

', '

luffy_info

', '

root_info']

注意,這裡不用提供讀寫模式!shelve預設開啟方式就支援同時讀寫操作。

#修改資料,先獲取到值,修改後先刪除該key,然後在建立key

in [6]: list(d.keys())

out[6]: ['

cmz_info

', '

luffy_info

', '

root_info']

in [7]: cmz_info = d.get('

cmz_info')

in [8]: cmz_info

out[8]:

in [9]: cmz_info['

password

']='

cmz123456

'in [10]: cmz_info

out[10]:

in [11]: del d['

cmz_info']

in [12]: list(d.keys())

out[12]: ['

luffy_info

', '

root_info']

in [13]: d['

cmz_info

']=cmz_info

in [14]: list(d.keys())

out[14]: ['

cmz_info

', '

luffy_info

', '

root_info']

in [15]: d.get('

cmz_info')

out[15]:

4 9學習筆記(python)

str len str 字串長度 split 以逗號切分 str2.join str 合併 str.replact a b 把a替換成b str.upper 變成全大寫 str.lower 變成全小寫 str.strip 去空格 str.lstrip 去左邊空格 str.rstrip 去右邊空格 l...

騰訊精選49 python

class solution object defreversestring self,s type s list str rtype none do not return anything,modify s in place instead.i,n 0,len s while i s i s 1 ...

49 Python中巢狀迴圈

目錄 巢狀迴圈 案例一案例二 案例三 乙個迴圈體內可以嵌入另乙個迴圈,一般稱為 巢狀迴圈 或者 多重迴圈 for i in range 5 for m in range 5 print i,end t print 起到換行的作用輸出效果 d wwwroot pyiteam venv scripts ...