shelve模塊是一個簡單的k,v將內存數據經過文件持久化的模塊,能夠持久化任何pickle可支持的python數據格式,他只有一個函數就是open(),這個函數接收一個參數就是文件名,而後返回一個shelf對象,你能夠用他來存儲東西,就能夠簡單的把他看成一個字典,當你存儲完畢的時候,就調用close函數來關閉。python
>>> import shelve緩存
>>> sfile = shelve.open('shelve_test') # 打開一個文件app
>>> sfile['k1'] = ['a','b'] # 持久化存儲列表ide
>>> sfile['k1']函數
['a','b']spa
>>> sfile.close() # 文件關閉orm
pickle 存儲或讀取方式以下: 對象
將字符串轉換成只有python能認識的字符串存儲在文件中 內存
>>> import pickle字符串
>>> pw = open('test','wb')
>>> pw.write(pickle.dumps(['a','b']))
>>> pw.close()
經過pickle.load 將字符串轉成原數據形式
>>> pr = open('test','rb')
>>> prf = pickle.load(pr)
>>> prf
['a', 'b']
可是如今我想持久化存儲的列表進行操做,例如添加、刪除、數據等,那麼shelve 與 pickle是否都能這麼操做呢?
>>> import shelve
>>> sfile = shelve.open('shelve_test')
>>> sfile['k1'] = ['a','b']
>>> sfile['k1'].append('c')
>>> sfile['k1']
['a', 'b']
存儲的c到哪裏去了呢?其實很簡單,c沒有寫回,你把['a', 'b']存到了k1,當你再次讀取sfile['k1']的時候,sfile['k1']只是一個拷貝,而你沒有將拷貝寫回,因此當你再次讀取s['x']的時候,它又從源中讀取了一個拷貝,
因此,你新修改的內容並不會出如今拷貝中,解決的辦法就是,第一個是利用一個緩存的變量,但這隻能適用一個
對象,面對多個對象就一籌莫展了:
>>> tmp = sfile['k1']
>>> tmp.append('c')
>>> sfile['k1'] = tmp
>>> sfile['k1']
['a', 'b', 'c']
>>> sfile['k2'] = ['1','2']
>>> sfile['k2'].append('3')
>>> sfile['k2']
['1', '2']
那麼怎麼才能從根本上達到我想要的效果呢?咦!有一個辦法,剛纔提到c沒有寫回,若是讓全部更
改數據都寫回不就能達到效果了嗎,那就是writeback,將writeback置爲True,見效果:
>>> sfile = shelve.open('shelve_test')
>>> sfile.writeback = True
>>> sfile['k1']
['a', 'b', 'c']
>>> sfile['k1'].append('d')
>>> sfile['k1']
['a', 'b', 'c', 'd']
>>> sfile['k2'] = ['1','2']
>>> sfile['k2']
['1', '2']
>>> sfile['k2'].append('3')
>>> sfile['k2']
['1', '2', '3']
另外,shelve 之VS. pickle 固然pickle也有一樣的功能,在成爲pickle的對象後即爲列表對象,由此可對list
進行一系列的操做
>>> pw = open('test1','wb')
>>> pw.write(pickle.dumps(['a','b']))
>>> pw.close()
>>> pr = open("test1","rb")
>>> prf = pickle.load(pr)
>>> print(prf)
['a', 'b']
>>> print(prf.append('c'))
None
>>> print(prf)
['a', 'b', 'c']
>>>