2016-11-12 6 views
1

Ich habe ein Wörterbuch 'word_dictionary' in einer Datei gespeichert und kann im Hauptprogramm darauf zugreifen. Ich muss einen Benutzer veranlassen, einen Eintrag dem Wörterbuch hinzuzufügen. Aber ich bin nicht in der Lage den Eintrag im Wörterbuch ad acta zu speichern, und ich bekomme die Fehlermeldung:Aktualisieren eines auf eine Datei geschriebenen Wörterbuchs

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 

Wenn der Code wieder um Schleifen - der Code funktioniert auf dem ersten Lauf.

Dies ist der Code, um das Wörterbuch zu aktualisieren, gemeint ist:

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() 

Und dies ist der Code, der nicht nach dem Update nicht abgeschlossen wird funktioniert (ich glaube nicht, das ist ein Teil von Das Problem, aber ich kann falsch liegen)

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

Vielen Dank im Voraus für Ihre Hilfe und Geduld! UPDATE Dies ist der Beginn des Codes, wo ich word_dictionary nennen, die importiert wird:

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() 

Dies ist, wie das ursprüngliche Wörterbuch ich hinzufügen möchte sitzt:

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

Ich bin mir nicht sicher, was Sie in 'Regal ['word_dictionary']' 'setzen? Sie scheinen das Shelf als Wert für sich selbst im zweiten Snippet festzulegen. – amirouche

+1

Beide Snippets stammen aus einer anderen .py-Datei als die Datei mit der Liste, die ich dann in diese Datei importiere. In der Datei, wo es das Wörterbuch gebeizt ist: word_dictionary = { 'Hoffnung Wörter': 'hope_words', 'Merry Worte': 'merry_words', 'Amazement Wörter': 'amazement_words'} Ich setze word_dictionary zu Ich muss mich nicht jedes Mal im Rest des Codes auf das Regal beziehen. Es ist das erste Mal, dass ich Regale benutze. Bitte korrigiere mich, wenn das nicht nötig ist! – Jess

Antwort

0

Das Problem ist, dass Sie Datenbank-Updates von Objekten trennen müssen, die von der Datenbank in den Speicher geladen werden.

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

Dieser Code geladen, um die dict in den Speicher, genannt seine update Methode, um das Ergebnis der update Verfahren zurück zum Regal dann die aktualisierte In-Memory-Wörterbuch zugewiesen gelöscht. Aber dict.update gibt None zurück und Sie überschreiben das Wörterbuch vollständig. Sie fügen das Dict in eine Variable ein, aktualisieren es und speichern die Variable.

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

UPDATE

Es war eine Frage, ob die neuen Daten gespeichert wird, wenn das Regal geschlossen ist. Hier ist ein Beispiel

# 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

Vielen Dank - Sie haben ein paar Stunden Kopfschmerzen gelindert! Ich war gerade verzweifelt zur Flasche gegangen, haha. – Jess

+0

Diese Methode ist wirklich gut - aber es scheint nicht dauerhaft zu speichern, wenn ich die Datei schließe und sie wieder öffne? – Jess

+0

@Jess Ich habe ein Beispiel für die Updates hinzugefügt, die 'close' überleben. Wenn Sie ein Problem haben, könnte es sich um einen Fehler in Ihrem Code handeln. – tdelaney

Verwandte Themen