Daten in das Wörterbuch eingeben

So habe ich zB eine Textdatei:

RootObject: Sun Object: Sun Satellites: Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune,Ceres,Pluto,Haumea,Makemake,Eris Radius: 20890260 Orbital Radius: 0 Object: Earth Orbital Radius: 77098290 Period: 365.256363004 Radius: 6371000.0 Satellites: Moon Object: Moon Orbital Radius: 18128500 Radius: 1737000.10 Period: 27.321582 

Und ich versuche es in ein Wörterbuch einzugeben. Dies ist, was ich bisher habe, aber ich bekomme immer einen Fehler …

 #d = dictionary #new_d = new dictionary file = open("data.txt","r") d = {} def data(file): for line in file: if line != line.strip: continue line = line.strip() key = line.split(":") val = line.split(":") if key in d and key == "Object": print(d) d[key] = val print(d) new_d = {} with file as x: for d in data(x): new_d[d["Object"]] = d print(nd) 

Ich sollte so etwas bekommen:

 {' Earth': {'Satellites': ' Moon', 'Orbital Radius': ' 77098290', 'Object': ' Earth', 'Radius': ' 6371000.0', 'Period': ' 365.256363004'}, ' Moon': {'Orbital Radius': ' 18128500', 'Object': ' Moon', 'Radius': ' 1737000.10', 'Period': ' 27.321582'}, ' Sun': {'Satellites': ' Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune,Ceres,Pluto,Haumea,Makemake,Eris', 'Orbital Radius': ' 0', 'Object': ' Sun', 'Radius': ' 20890260', 'RootObject': ' Sun'}} 

Ich bekomme diesen Fehler:

 Traceback (most recent call last): File "planet2.py", line 21, in <module> for d in data(x): TypeError: 'NoneType' object is not iterable 

  • Initialisieren einer Liste in eine Variable in einem Wörterbuch innerhalb einer Schleife
  • Einen bestimmten Wert aus der Liste des Wörterbuchs in python finden
  • Zusammenführen von Python-Wörterbüchern
  • Ein Element eines Tupel-Dikt-Key-Matching in Python
  • Auswahl zwischen Regal und sqlite für wirklich großes Wörterbuch (Python)
  • Ist es möglich, ein python dict eine anfängliche kapazität (und ist es nützlich)
  • Der Versuch, den Wörterbuchwerten hinzuzufügen, indem du Vorkommnisse in einer Liste von Listen (Python)
  • Python dict.add_by_value (dict_2)?
  • 2 Solutions collect form web for “Daten in das Wörterbuch eingeben”

    Das wird gut tun:

     file = open("data.txt","r") def data(file): dic = {} for line in file: # If line not blank if line.strip() != '': key,value = line.split(":") if key == 'RootObject': dic[key] = value.strip() elif key == 'Object': # Get the Object value ie Earth, Moon, Sun obj = value.strip() # Create entry with obj key and blank dictionary value dic[obj]={} else: # Populate the blank dictionary with key, value pairs dic[obj][key] = value.strip() return dic planets = data(file) # Usage print planets print planets['Earth'] print planets['Earth']['Radius'] 

    Ausgabe:

     # The whole dictionary {'Sun': {'Satellites': 'Mercury,Venus,Earth,Mars,Jupiter,Saturn,Uranus,Neptune,Ceres,Pluto,Haumea,Makemake,Eris', 'Orbital Radius': '0', 'Radius': '20890260'}, 'Moon': {'Orbital Radius': '18128500', 'Radius': '1737000.10', 'Period': '27.321582'}, 'Earth': {'Satellites': 'Moon', 'Orbital Radius': '77098290', 'Radius': '6371000.0', 'Period': '365.256363004'}} # The Earth dictionary {'Satellites': 'Moon', 'Orbital Radius': '77098290', 'Radius': '6371000.0', 'Period': '365.256363004'} # The Earth's radius 6371000.0 

    Es gibt ein paar verschiedene Fehler in Ihrem Code. Diejenige, die Ihre Exception verursacht, ist, dass Ihre Funktionsdaten in eine globale Variable schreiben und gibt nichts zurück, aber Ihr späterer Code erwartet, dass es etwas Iterable zurückgibt, wie zB eine Sequenz oder einen Generator.

    Sie könnten dies entweder reparieren, indem Sie den Top-Level-Code direkt auf dem globalen Wörterbuch iterieren, oder Sie könnten loswerden der globalen und erstellen Sie das Wörterbuch in data und geben Sie es am Ende. Ich schlage vor, dass die letzteren, da globale Variablen schwer zu behandeln sind, da Ihr Code komplizierter wird.

    Hier ist eine grobe Skizze, wie das funktionieren sollte (ich verlasse den Mittelteil skizzenhaft, da ich später darüber sprechen werde):

     def data(file): objects = {} # add stuff to objects dict return objects 

    Ihr nächster Fehler ist mit Strippen Ihre Linien. Dein Code testet derzeit jede Zeile für Ungleichheit mit einer eigenen strip . Dies ist ein Fehler in Python 3, da line und line.strip unvergleichliche Typen haben. Aber selbst wenn es funktionierte, wäre es sinnlos. Ich vermute, dass du versucht hast, leere Zeilen zu beseitigen, indem du sie zuerst abstreifst und irgendwelche lehnst, die nachher leer sind. Hier kannst du das machen

     if not line.strip(): continue 

    Dies ist ein Beispiel dafür, was einige Leute in der Python-Community nennen "schauen Sie, bevor Sie springen" (LBYL) Programmierstil, da Sie auf etwas überprüfen, das ein Problem sein kann, bevor es eins wird. Eine Alternative ist die "leichter zu bitten Vergebung als Erlaubnis" (EAFP) Stil, wo Sie einfach wickeln den Bereich, wo die Mühe könnte in einem try Block entstehen und fangen die Ausnahmen, die erzeugt werden. EAFP-Stil wird manchmal als mehr "Pythonic", so werde ich zeigen, dass Stil ein bisschen später.

    Der nächste Fehler ist ein logischer, nicht etwas, das einen Fehler verursacht. Sie teilen Ihre Linie und Sie wollen die beiden Teile davon in die Variablen key und value . Allerdings machst du zwei getrennte Zuordnungen zu diesen Variablen, und in der Tat sind sie am Ende mit dem gleichen Wert in jedem. Dies ist ein Ort, an dem Sie eine coole Funktion der Python-Syntax verwenden, auspacken. Anstatt jede Variable separat zuzuordnen, können Sie beiden gemeinsam eine zweidimensionale Sequenz (zB eine Liste oder ein Tupel) zuordnen. Python kümmert sich darum, den ersten Wert der ersten Variablen und den zweiten Wert der zweiten Variablen zu geben. Hier ist, wie es aussieht:

     key, value = line.split(":") 

    Das wird scheitern, wenn es keinen Dickdarm in der Linie natürlich gibt, also ist es ein guter Platz für uns, um einen try zu setzen try wenn wir den EAFP-Stil der Codierung verwenden. Hier ist eine Möglichkeit, es zu tun:

     try: key, value = line.split(":") except ValueError: continue 

    Sie könnten stattdessen den try um alles herum, was in der Schleife bleibt, dann lassen Sie den except Block enthalten nur pass (was nichts tut, aber ignoriert die Ausnahme).

    Schließlich ist der letzte logische Fehler, den du mit dir gemacht hast, wie du deine verschachtelten Wörterbücher baust. Ihr gegenwärtiger Ansatz besteht darin, zuerst ein einziges Wörterbuch mit allen Schlüsseln und Werten aus deiner Datei zu erstellen, dann sie in einzelne Stücke aufzuteilen, eine pro himmlisches Objekt. Dies funktioniert jedoch nicht, wenn die Tasten für jedes Objekt gleich sind. Da jedes Objekt einen "Orbitalradius" -Taste hat, werden sie alle alle übereinander schreiben und diesen Schlüssel in das einzelne Wörterbuch stellen.

    @ Sudo_os Antwort zeigt, wie man das innere Wörterbuch baut und es mit Werten füllt (es ist fast identisch mit dem, was ich schreiben würde). Ich wollte nur den Rest meiner Erklärungen posten!

    Python ist die beste Programmiersprache der Welt.