day6 shelve模塊
shelve模塊
shelve模塊是一個簡單的k,v將內存數據通過文件持久化的模塊,可以持久化任何pickle可支持的python數據格式,shelve模塊是對pickle模塊的補充。我們知道,如果調用pickle模塊,向文件中dump()字符串的時候,讀取的時候必須一次一次進行load()。
首先,我們使用pickle向文件中寫入信息,來看一下情況:
import pickle
ufo = {"alex":123,"tom":456}
l1 = [11,22,33,44]
with open("file_json","wb") as f:
pickle.dump(ufo,f) #把字典dump()到文件中
pickle.dump(l1,f) #把列表dump()到文件中
上面程序,我們向文件"file_json"中寫入了一個字典和一個列表。接下來,我們使用load()來讀取文件中的信息。如下:
import pickle
with open("file_json","rb") as f:
a = pickle.load(f) #使用load()反序列化,讀取文件信息
print(a)
b = pickle.load(f) #使用load()反序列化,讀取文件信息
print(b)
運行如下:
{‘alex‘: 123, ‘tom‘: 456}
[11, 22, 33, 44]
從上面代碼運行的結果可以看出,得到的是上面dump()進去的字典和列表。但是只能一次一次的讀取,遵循先進先出的原則,最先dump()進去的數據也最先load()出來,但是這樣也存在一定的缺陷,比如我想直接取列表的信息,但是由於列表是後面添加進去的,因為只能load()兩次,如何才能直接提取列表呢?shelve模塊就是解決這樣的問題的。
shelve模塊存儲文件信息
import shelve class func(object): def __init__(self,n): self.n = n d = {"alex":"sb","tom":"is","aoi":"456"} l = ["alex","pipei","erbi"] fun = func(1568) #生成一個類個體 with shelve.open("shelve_test") as f: #使用shelve模塊打開文件 f["fun"] = fun #往shelve模塊中添加變量,以k,v形式進行添加文件信息,首先添加一個類變量 f["d"] = d #添加一個字典 f["l"] = l #添加一個列表
shelve模塊讀取文件信息
import shelve #讀取 with shelve.open("shelve_test","r") as f: #使用shelve打開模塊 a = f.get("d") print(a) b = f.get("fun") #指定鍵值對形式獲取存儲信息 print(b.n)
運行結果如下:
{‘alex‘: ‘sb‘, ‘tom‘: ‘is‘, ‘aoi‘: ‘456‘}
1568
可以看出,使用shelve模塊,能夠指定命的形式來獲取存儲的信息,不需要按照順序,讓我們使用比較方便,克服了pickle的缺陷,因此,要經常使用shelve模塊進行文件的存儲與讀取。
註意:使用shelve模塊打開文件的方法是open(),shelve.open("file_name"),不需要指定以什麽形式打開,並且讀取文件的時候也是,使用shelve.open()打開文件。要想獲得shelve模塊中的文件信息,要使用get()方法,f.get()來獲取文件中的信息。
day6 shelve模塊