shelve
#shelve是一個簡單的資料儲存方案,他只有一個函數就是open (),這個函數接收一個參數就是檔名,然後回傳一個shelf對象,你可以用他來儲存東西,就可以簡單的把他當作一個字典,當你儲存完畢的時候,就呼叫close函數來關閉
這個有一個潛在的小問題,如下:
[python] view plain copy >>> 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']的時候,它又從源中讀取了一個拷貝,所以,你新修改的內容並不會出現在拷貝中,解決的辦法就是,第一個是利用一個快取的變量,如下所示
[python] view plain copy >>> temp = s['x'] >>> temp.append('d') >>> s['x'] = temp >>> s['x'] ['a', 'b', 'c', 'd']
在python2.4中有了另外的方法,就是把open方法的writeback參數的值賦為True,這樣的話,你open後所有的內容都將在cache中,當你close的時候,將全部一次寫到硬碟裡面。如果資料量不是很大的時候,建議這麼做。
在python3中我們使用json或pickle持久化數據,能dump多次,但只能load一次,因為先前的資料已經被後面dump的資料覆蓋掉了。如果我們想要實作dump和load多次,可以使用shelve模組。 shelve模組可以持久化所有pickle所支援的資料類型。
import shelve import datetime info = {'name': 'bigberg', 'age': 22} name = ['Apoll', 'Zous', 'Luna'] t = datetime.datetime.now() with shelve.open('shelve.txt') as f: f['name'] = name # 持久化列表 f['info'] = info # 持久化字典 f['time'] = t # 持久化时间类型
執行程式碼後會產生3個檔案:shelve.txt.bak、shelve.txt.dat、shelve.txt.dir。
shelve.txt.bak 的內容
'info', (512, 45) 'name', (0, 42) 'time', (1024, 44)
�]q (X ApollqX ZousqX Lunaqe. �}q (X ageqKX nameqX bigbergqu. �cdatetime datetime q C �" 2�q�qRq.
'info', (512, 45) 'name', (0, 42) 'time', (1024, 44)
import shelve with shelve.open('shelve.txt') as f: n = f.get('name') i = f.get('info') now = f.get('time') print(n) print(i) print(now) #输出 ['Apoll', 'Zous', 'Luna'] {'age': 22, 'name': 'bigberg'} 2017-07-08 11:07:34.865022
1、shelve模組是一個簡單的key,value將記憶體資料通過檔案持久化的模組。
2、shelve模組可以持久化任何pickle可支援的python資料格式。
3、shelve就是pickle模組的一個封裝。
4、shelve模組是可以多次dump和load。
以上是shelve模組的基本介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!