Python in eine JSON-Datei schreiben?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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

schnfz  05.08.2022, 11:12

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...

1
PWolff  05.08.2022, 11:22
@schnfz

Danke.

Typischer Fall von Betriebsblindheit: man vergisst, sich zu fragen, ob ein komplett anderes Werkzeug die Aufgabe nicht besser, schneller und/oder einfacher löst.

0

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.

yoda1997 
Fragesteller
 05.08.2022, 09:53

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.

0
PhotonX  05.08.2022, 11:11
@yoda1997

Wenn du einen Musiker später hinzufügen willst, kannst du die Datei parsen, als Objekt einlesen, dieses Objekt um einen Musiker erweitern, dann das erweiterte Objekt komplett in die Datei schreiben (und den ursprünglichen Inhalt der Datei überschreiben).

0
whgoffline  05.08.2022, 09:58

Doch in der Zeile steht's.

json.dump(new_data, file, indent=1)
0
PhotonX  05.08.2022, 11:11
@whgoffline

Na ja, da wird ja nur ein einziger Musiker hinzugefügt, deswegen meine Frage.

0

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 } .

yoda1997 
Fragesteller
 05.08.2022, 10:13

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.

1
yoda1997 
Fragesteller
 05.08.2022, 10:15
@TechPech1984

Kannst du mir noch sagen wie ich zwei Dictionarys zusammenfüge

0
TechPech1984  05.08.2022, 10:17
@yoda1997

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 .

0
schnfz  05.08.2022, 10:35
@yoda1997

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.

1

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

TechPech1984  05.08.2022, 10:32

gib ihm mal tips wo er das findet, den das wurde bei mir gefragt, wie er das machen kann .

0