2016-11-12 71 views
1

我在文件中放置了擱置字典'word_dictionary',我可以在主程序中訪問它。我需要讓用戶能夠將條目添加到字典中。但我無法保存在擱置字典中的條目,我得到的錯誤:更新寫在文件上的擱置字典

Traceback (most recent call last): 
    File "/Users/Jess/Documents/Python/Coursework/Coursework.py", line 16, in <module> 
    word_dictionary= dict(shelf['word_dictionary']) 
TypeError: 'NoneType' object is not iterable 

當代碼環回身邊 - 代碼工作在第一次運行。

這是這是爲了更新字典代碼:

shelf = shelve.open("word_list.dat") 
    shelf[(new_txt_file)] = new_text_list 
    shelf['word_dictionary'] = (shelf['word_dictionary']).update({(new_dictionary_name):(new_dictionary_name)}) 
    #not updating 
    shelf.sync() 
    shelf.close() 

這是更新不完整後不工作(我不認爲這是部分的代碼這個問題,但我可能是錯的)

shelf = shelve.open("word_list.dat") 
shelf.sync() 
word_dictionary= dict(shelf['word_dictionary']) 

預先感謝您的幫助和耐心! UPDATE 這就是我所說的word_dictionary的代碼被導入的開始:

while True: 
shelf = shelve.open("word_list.dat") 
print('{}'.format(shelf['word_dictionary'])) 
word_dictionary= dict(shelf['word_dictionary']) 
print(word_dictionary) 
word_keys = list(word_dictionary.keys()) 
shelf.close() 

這是原來的字典我要添加到如何坐:

shelf['word_dictionary'] = {'Hope Words': 'hope_words', 'Merry Words': 'merry_words', 'Amazement Words': 'amazement_words'} 
+0

我不知道你在裏面放入貨架'[「word_dictionary」]'?您似乎在第二個片段中將架子設置爲自身的價值。 – amirouche

+1

這兩個片段都來自不同的.py文件,而不是帶有擱置列表的文件,然後我將其導入該文件。 在其被酸洗字典中的文件是: word_dictionary = {「希望詞」:「hope_words」,「風流詞」:「merry_words」,「驚愕詞」:「amazement_words」} 我設置word_dictionary到本身我不需要在代碼的其餘部分每次都參考貨架。這是我第一次使用貨架,所以請糾正我,如果這不是必要的! – Jess

回答

0

的問題是您必須將數據庫加載的對象的擱置數據庫更新分離到內存中。

shelf['word_dictionary'] = (shelf['word_dictionary']).update({(new_dictionary_name):(new_dictionary_name)}) 

此代碼加載dict到內存中,稱爲其update方法,分配update方法的結果回擱板然後刪除的更新的存儲器字典。但dict.update返回無,並且您完全覆蓋字典。你把字典放在一個變量中,更新,然後保存變量。

words = shelf['word_dictionary'] 
words.update({(new_dictionary_name):(new_dictionary_name)}) 
shelf['word_dictionary'] = words 

UPDATE

有一個問題,當在貨架被關閉的新數據是否被保存。下面是一個例子

# Create a shelf with foo 
>>> import shelve 
>>> shelf = shelve.open('word_list.dat') 
>>> shelf['foo'] = {'bar':1} 
>>> shelf.close() 

# Open the shelf and its still there 
>>> shelf = shelve.open('word_list.dat') 
>>> shelf['foo'] 
{'bar': 1} 

# Add baz 
>>> data = shelf['foo'] 
>>> data['baz'] = 2 
>>> shelf['foo'] = data 
>>> shelf.close() 

# Its still there 
>>> shelf = shelve.open('word_list.dat') 
>>> shelf['foo'] 
{'baz': 2, 'bar': 1} 
+0

非常感謝你 - 你已經舒緩了幾個小時的頭痛!我只想在絕望中去瓶子哈哈。 – Jess

+0

這種方法非常好 - 但是如果我關閉文件並再次打開它,它似乎不會永久保存它。 – Jess

+0

@Jess我增加了一個倖存'close'的例子。如果你有問題,它可能是你的代碼中的一個錯誤。 – tdelaney