shelve模塊 shelve類似於一個key-value資料庫,可以很方便的用來保存Python的記憶體對象,其內部使用pickle來序列化數據,簡單來說,使用者可以將一個列表、字典、或者用戶自定義的類實例保存到shelve中,下次需要用的時候直接取出來,就是一個Python記憶體對象,不需要像傳統數 ...
shelve模塊
shelve類似於一個key-value資料庫,可以很方便的用來保存Python的記憶體對象,其內部使用pickle來序列化數據,簡單來說,使用者可以將一個列表、字典、或者用戶自定義的類實例保存到shelve中,下次需要用的時候直接取出來,就是一個Python記憶體對象,不需要像傳統資料庫一樣,先取出數據,然後用這些數據重新構造一遍所需要的對象。下麵是簡單示例:
shelve存儲數據:
import shelve,datetime
names = ["alex","tom","tenglan"]
ages = [18,16,15]
f = shelve.open("database")
f["age"] = ages
f["name"] = names
f['date'] = datetime.date.today()
f.close()
上面代碼中,我們使用shelve打開文件並往裡面寫入數據,是以字典形式寫入數據,句柄f相當於字典一樣,往文件添加數據,就跟我們往字典中添加數據的原理是一樣的,如f["age"]=ages,鍵值對。
shelve讀取數據:
import shelve,datetime f = shelve.open("database") print(f.keys()) print(f.values()) print(type(f.get("name"))) print(f.get("age")) print(f.get("date")) f.close() 運行如下: KeysView(<shelve.DbfilenameShelf object at 0x7f0e89a97898>) ValuesView(<shelve.DbfilenameShelf object at 0x7f0e89a97898>) <class 'list'> [18, 16, 15] 2017-07-23
上面代碼,我們把存儲的數據對去出來了,可以看出,讀取出來的數據類型沒有改變,不是字元串,並且文件句柄就是一個字典,存儲在文件句柄中一樣。
shelve模塊打開文件還有一個神奇的地方,就是如果這個文件不存在則創建,如果這個文件存在則讀取。
這個有一個潛在的小問題,如下:
>>> import shelve
>>> s = shelve.open("test.dat")
>>> s["x"] = ["a","b","c"]
>>> s["x"].append("d")
>>> s["x"]
['a', 'b', 'c']
存儲的d到哪裡去了呢?其實很簡單,d沒有寫入,我們把["a","b","c"]存儲到了x,當我們再次讀取s["x"]的時候,s["x"]只是一個拷貝,而我們沒有將拷貝寫回,所以當我們再次讀取s["x"]的時候,它又從源中讀取了一個拷貝,所以,我們新修改的內容並不會出現在拷貝中,解決的辦法就是,第一個是利用一個緩存的變數,如下所示: >>> import shelve
>>> s = shelve.open("test.dat")
>>> tmp = ["a","b","c"]
>>> s["x"] = tmp
>>> tmp.append("d")
>>> s["x"] = tmp
>>> s['x']
['a', 'b', 'c', 'd']
s.close()
文件寫進去時候是不能直接修改的,就算修改了,也要重新寫進去,這就是文件的要求,不可能修改之後,文件裡面直接改變。
import shelve,datetime
f = shelve.open("database")
print(f.keys())
print(f.values())
print(type(f.get("name")))
print(f.get("age"))
print(f.get("date"))
f.close()