@stevie004: Noch ein paar Anmerkungen zum Quelltext:
Beim öffnen von Textdateien sollte man immer explizit die Kodierung angeben. Die JSON-Spezifikation geht mehr oder weniger nur von ASCII aus, aber wenn eine andere Kodierung verwendet wird, ist das in der Regel immer UTF-8. Da ASCII eine Untermenge von UTF-8 ist, schaded es nicht grundsätzlich UTF-8 anzugeben.
In Namen sollte man weder Abkürzungen (`f`, `orig`) noch Grunddatentypen (`dict`) verwenden. Wenn man `file` meint, sollte man nicht `f` schreiben. Bei den Grunddatentypen hat man öfter als man denkt das Problem das man den Datentyp im Laufe der Programmentwicklung ändert, und dann hat man entweder falschen, irreführende Namen im Quelltext, oder muss die überall anpassen.
Mit `pprint.pprint()`, was insbesondere bei vielen/tief verschachtelten Grunddatentypen die Ausgabe etwas übersichtlicher macht:
Code: Alles auswählen
#!/usr/bin/env python3
import json
from pprint import pprint
def main():
with open("test.json", "r", encoding="utf-8") as file:
data = json.load(file)
pprint(data)
# {'nummer1': {'nummer2': {'nummer3': {'key1': 'Value A', 'key2': 'Value B'}}}}
data["nummer1"]["nummer2"]["nummer3"]["key3"] = "Value C"
pprint(data)
# {'nummer1': {'nummer2': {'nummer3': {'key1': 'Value A',
# 'key2': 'Value B',
# 'key3': 'Value C'}}}}
if __name__ == "__main__":
main()
Eine Alternative zu `pprint` ist das externe `prettyprinter`, das einen anderen Algorithmus für das Layout verwendet und am Terminal auch farbige Ausgaben machen kann. Wenn man das statt `pprint` so importiert: ``from prettyprinter import cpprint as pprint`` bekommt man diese Ausgabe:
Code: Alles auswählen
{
'nummer1': {
'nummer2': {'nummer3': {'key1': 'Value A', 'key2': 'Value B'}}
}
}
{
'nummer1': {
'nummer2': {
'nummer3': {
'key1': 'Value A',
'key2': 'Value B',
'key3': 'Value C'
}
}
}
}
Falls die Schlüssel in den Wörterbüchern gültige Bezeichner in Python sind, kann das externe `addict`-Modul den Zugriff per Attribute ermöglichen:
Code: Alles auswählen
#!/usr/bin/env python3
import json
from pprint import pprint
from addict import Dict
def main():
with open("test.json", "r", encoding="utf-8") as file:
data = Dict(json.load(file))
pprint(data)
data.nummer1.nummer2.nummer3.key3 = "Value C"
pprint(data)
if __name__ == "__main__":
main()
Für diesen Fall im Grunde mit Kanonen auf Spatzen geschossen wäre das (externe) `glom`-Modul:
Code: Alles auswählen
#!/usr/bin/env python3
import json
from pprint import pprint
from glom import assign
def main():
with open("test.json", "r", encoding="utf-8") as file:
data = json.load(file)
pprint(data)
assign(data, "nummer1.nummer2.nummer3.key3", "Value C")
pprint(data)
if __name__ == "__main__":
main()
Das Modul ist nützlich wenn man JSON-(ähnliche) Daten transformieren will. Also zum Beispiel Daten nach einem bestimmten Muster auswählen und/oder aggregieren. Das ist so ein bisschen wie XPATH/XSLT für XML.
Falls man JSON-Daten validieren und Werte konvertieren will und/oder aus Python-Objekten JSON nach einem bestimmten Schema erstellen möchte, sei noch auf das `marshmallow`-Modul hingewiesen.