shelve 之VS. pickle

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']

            >>> 

相關文章
相關標籤/搜索