2013-08-30 26 views
2

我們使用shelve.open創建數據庫文件然後關閉程序後,如果我們再次運行代碼,但是用不同的輸入,它實際上替換文本而不是它追加它。如何*附加*文本到擱置打開的數據庫文件?

如何是否可以改變這種行爲? 例如:

db = shelve.open('store') 
    db['some variable'] = some value 
    db['another variable'] = another value 
    db.close() 

當我們寫相同的代碼,但現在用同一個變量不同的值,我們更換於前值,而不是附加值給它。我該如何改變它?

+0

像[此](http://docs.python.org/2/library/shelve.html)?見11.4.2實施例 – MakeCents

+0

'分貝[「一些變量」] =分貝[「一些變量」] +一些value'假設你打開與'寫回= TRUE'貨架。 – martineau

+0

什麼是「一些價值」? 「另一個值」也是同樣的問題。他們是否列出?整型?文本? – Paco

回答

2

假設你的價值觀是列表:

  • 使用db = shelve.open('store',writeback=True)然後追加值,以相同的密鑰。

  • 因爲您的代碼不開放'store'writeback=True你 必須分配一個變量的關鍵,temp = db['some variable'],這將是 some value的值,然後追加該變量,temp.append(another value),然後重新分配密鑰值,db['some variable'] = temp

應該不是你的代碼的第三行是db['some variable'] = another value'爲了更換價值?

編輯:問題其他可能的含義是什麼?

你的意思是你要的數據庫加載到你的對象,並繼續使用「UI」代碼關閉程序後編輯呢?如果是這樣,那麼你可以這樣做:

class Update_MyStore(MyStore): 
    def __init__(self, store): 
     db = shelve.open(store) 
     for i in db: 
      setattr(self, i, db[i]) 
     self.items() 
     self.store_in_db() 
Update_MyStore('store') 

編輯:另一種選擇,更新,如果是這樣的話,如果你想添加或更新特定項目:

while True: 
    store = shelve.open('store',writeback = True) 
    Item = input('Enter an item: ').capitalize() #I prefer str(raw_input('Question ')) 
    if not Item or Item == 'Break': 
     break 
    store['item_quantity'][Item] = int(input(('Enter the number of {0} available in the store: ').format(Item))) 
    store['item_rate'][Item] = float(input(('Enter the rate of {0}: ').format(Item))) 
    store.sync() 
    store.close() 
+0

謝謝!我試過你的後一種解決方案,因爲這看起來像是我的一部分(我是一個初學者),它的工作! 另外,如果可能的話,你可以向我解釋發生了什麼事,store.sync()和回寫? 我其實試過尋找它,但我無法得到一個很好的說明,所以。 再次,謝謝。 –

+0

很高興爲您提供幫助。它在以下鏈接的11.4和11.4.2註釋中解釋:[鏈接到同步和寫回說明](http://docs.python.org/2/library/shelve.html) – MakeCents