Python in eine JSON-Datei schreiben?
Hallo zusammen,
kann mir jemand sagen, was ich bei meinem Quellcode hinzufügen muss, damit die JSON-Datei nicht mehr so aussieht:
{
"Taylor": {
"Name": "Taylor",
"Alter": "32",
"jahrgang": "1989"
}
}{
"Selena": {
"Name": "Selena",
"Alter": "30",
"jahrgang": "1992"
}
}
sondern so:
{
"Taylor": {
"Name": "Taylor",
"Alter": "32",
"jahrgang": "1989"
},
"Selena": {
"Name": "Selena",
"Alter": "30",
"jahrgang": "1992"
}
}
Code:
DicMusiker = {}
def schreibe_Musiker(new_data, filename="test.json"):
with open(filename, 'a+') as file:
file.seek(0)
json.dump(new_data, file, indent=1)
musiker = input("Musiker")
alter = input("Alter")
jahrgang = input("Jahrgang")
DicMusiker[musiker] = {}
DicMusiker[musiker]['Name'] = musiker
DicMusiker[musiker]['Alter'] = alter
DicMusiker[musiker]['jahrgang'] = jahrgang
print(DicMusiker)
schreibe_Musiker(DicMusiker)
4 Antworten
Wie schon die bisherigen Antworten sagen, ist die einfachste - und letztlich einzig saubere - Möglichkeit, jedesmal das komplette Array in die Datei zu schreiben.
Das ist bei heutigen Dateisystemen auch keine Bremse mehr - geänderte Dateiinhalte werden zunächst nur im Arbeitsspeicher vorgehalten und erst dann tatsächlich auf die Platte geschrieben, wenn längere Zeit Leerlauf ist oder der Arbeitsspeicher knapp wird. (Gibt natürlich Probleme, wenn der Computer zwischendrin abstürzt - dafür gibt es dann so was wie "flush", das erzwingt, dass die geänderten Daten sofort auf die Platte kommen.)
(Nachträglich eingefügte Anmerkung: Da ich noch aus der Zeit komme, wo Dateien auf langsame "Disketten" geschrieben wurden, habe ich im Folgenden mal beschrieben, was wir damals gemacht hätten. Ist allerdings heute nur noch von historischem Interesse. - Bei Audiokassetten hätten wir vermutlich entweder das komplette Array neu geschrieben - ist bei Audiokassetten genauso langsam wie das Suchen einer bestimmten Stelle; mit Magnetbändern, die auch schnell umgespult werden konnten, habe ich nie ernsthaft gearbeitet. Das Folgende ist aus heutiger Sicht ein wenig technomanisch.)
Allerdings gibt es auch die Möglichkeit, dass du den neuen Datensatz "zwischenschiebst" - du überschreibst das letzte Zeichen, die schließende geschweifte Klammer, mit einem Komma, hängst den neuen Datensatz an und am Ende wieder die schließende geschweifte Klammer.
Allerdings scheint es in Python keine (einfache) Möglichkeit zu geben, an bestimmte Stellen einer Textdatei zu schreiben, ohne den kompletten übrigen Inhalt der Datei in eine andere Datei zu übertragen (habe jedenfalls im Internet nichts dazu gefunden, und angesichts etwa der UTF-8-Codierung mit verschiedenen Byte-Breiten je Zeichen auch nicht sinnvoll). Demnach müsstest du eine Binärdatei verwenden (https://www.delftstack.com/de/howto/python/write-bytes-to-file-python/) und dich darauf verlassen, dass die schließende Klammer immer im allerletzten Byte steht (was in sich schon schlechter Stil ist), außderdem musst du dann die Zeichen von Hand in Bytes umwandeln (im Fall von UTF-8-Codierung z. T. in Doppelbytes).
Aus deinem Code geht nicht hervor, wie du mehrere Musiker zusammenfügst und dann als JSON dumpst.
Aber die Idee dürfte es sein, dass du ein Objekt anlegst, das alle Musiker enthält, und das dann mit einem Streich dumpst.
Na ja, da wird ja nur ein einziger Musiker hinzugefügt, deswegen meine Frage.
Mein Problem ist, das wenn ich zu einen späteren Zeitpunkt noch ein Musiker hinzufügen möchte, dass dann die JSON Datei den Fehler von Oben bekommt.
du wirst es neu schreiben müssen
den so hängst du immer nur ein JSON objekt an , du willst aber eigentlich ein ARRAY basteln also mit KOMMA
dann kannst du aber nicht mit anhängen arbeiten . sondern deine daten sammeln und das gesammelte neu schreiben .
oder du schreibst zeile für zeile selber und springst an die vorletzte stelle und danach setzt du ein } .
Bedeutet also: Schritt 1 eine Methode schreiben, welche mir den aktuellen Inhalt in ein Dictionary zurückgibt. Schritt 2: die Dictionary zusammenfügen Schritt 3: das neue Dictionary in die JSON Datei schreiben.
Kannst du mir noch sagen wie ich zwei Dictionarys zusammenfüge
ich bin leider gar kein python künstler , ich sehe halt nur das wiedersprüchliche was du gerade machst . das ist nämlich in jeder programmiersprache gleich ;) einzelne objekte werden auch als einzelne objekte geschrieben . ein Array wird als JSON Array geschrieben .
und du willst ja eine auflistung von den einzelnen datensätzen . und nicht jeden für sich .
Musst du doch gar nicht. Du liest das Dictionary ein und hängst deinen neuen Musiker wie gehabt hinein. Dann schreibst du es raus.
Derzeit hast du ja die eher kuriose Situation, dass du immer separate Dictionaries mit jeweils nur einem Musiker machst - einen neuen Musiker dazuzunehmen erfordert aber überhaupt keinen anderen Code.
Warum das passiert, ist klar. Du baust immer ein neues JSON-Objekt und hängst es dann einfach ansatzlos an die Datei. Das ist in der Form kein gültiges JSON, die meisten JSON-Parser werden das nicht mögen.
Du erwartest aber, dass es ein komplettes JSON-Objekt gibt, das wiederum Objekte enthält.
Lösung somit: erst das Ganze in ein Dictionary reinlesen, dieses Dictionary erweitern, und dann wieder komplett rausschreiben.
(Zur Klarstellung: ein "Objekt" entspricht in JSON-Sprache dem, was in Python ein Dictionary ist.)
gib ihm mal tips wo er das findet, den das wurde bei mir gefragt, wie er das machen kann .
JSON ist halt für den Anwendungsfall ungeeignet, wenn das Anhängen so kritisch ist. Es gibt andere Serialisierungsformate die "appendable" sind - Protobuf etwa, aber notfalls sogar das gute alte CSV...