JSON Fortlaufend schreiben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Namlus
User
Beiträge: 70
Registriert: Donnerstag 5. Januar 2023, 15:10

Hallo, ich möchte meine daten gerne Fortlaufend in eine Json datei schreiben.
JSON da ich die in einem anderen Programm auslesen und weiterbearbeiten kann. Die Beispieldateien ändere ich dann noch gegen variablen, im ersten schritt geht es mir jedoch darum dass ich es schaffe die Datei zu erstellen.

Ich habe folgen Code:

import json
personen= {
"name": "Ich",
"telefon": 12345678,
"email": "ich@test.de"
}
with open("./kontakte.json", "w") as write_file:
json.dump(personen, write_file, )

Jedesmal wenn ich einen neuen Kontakt anlege möchte ich dass er in die Datei kontakte geschrieben wird. Und zwar fortlaufend. Wie schreibe ich da meinen Code um.....
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Dafür ist json nicht geeignet. In Deinem Fall dürfte sqlite das Mittel der Wahl sein.
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Oder JSON Lines: https://jsonlines.org/
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Namlus
User
Beiträge: 70
Registriert: Donnerstag 5. Januar 2023, 15:10

kbr hat geschrieben: Freitag 6. Januar 2023, 15:06 Dafür ist json nicht geeignet. In Deinem Fall dürfte sqlite das Mittel der Wahl sein.
Daran habe ich auch schon gedacht, aber da wäre für mich fast excel pratischer. Das ist mir allerdings zu "kompliziert". Ich setze mich gerade erst mit Python auseinander. Ich suche eine "einfache" Lösung. Ich habe ja nur 4 Spalten ich dachte schon daran diese ähnlich wie bei css
<zeitstemel>
<spalte1> Bli Bla Blub </spalte1>
<spalte2> Tätäräää </spalte2>
<zeitstempel>

usw. einfach in eine Textdatei zu schreiben, das wäre einfach und ohne viele Fehler einzulesen.

Und ne Textdatei kann ich soweit ich gesehen habe ja fortlaufend schreiben.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

CSV ist geeignet & quasi wie Excel.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Pack alternativ die Kontakte komplett in eine Datenstruktur und serialisiere diese nach JSON und entsprechend zurück.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
nezzcarth
User
Beiträge: 1638
Registriert: Samstag 16. April 2011, 12:47

Namlus hat geschrieben: Freitag 6. Januar 2023, 18:11 Ich habe ja nur 4 Spalten ich dachte schon daran diese ähnlich wie bei css
<zeitstemel>
<spalte1> Bli Bla Blub </spalte1>
<spalte2> Tätäräää </spalte2>
<zeitstempel>
Das ist kein CSS sondern (fehlerhaftes) XML. Wenn man das korrekt erzeugen möchte (d.h. programmatisch mit einer geeigneten Bibliothek), ist das von den bisher vorgeschlagenen Varianten die komplizierteste und aufwendigste, die für den genannten Anwendungszweck zudem keinerlei Vorteile hat. Und weil du es ansprichst: XML-Dateien sollte man auch nie wie reine Textdateien behandeln, auch wenn sie oberflächlich so aussehen mögen; damit handelt man sich wirklich nur Probleme ein. Wenn es in die Richtung gehen soll, wäre JSON bzw. JSON-Lines die bessere und modernere Alternative. An sich würde ich aber den Vorschlag, CSV zu verwenden, unterstützten.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

XML ist genauso ungeeignet für laufende Dateien wie JSON. Und wenn’s bei dir noch nicht mal für die Nutzung des CSV-Moduls reicht, dann kommst du erst recht nicht mit hintereinander geschriebenen, verschachtelten Dokumenten aus.
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Namlus hat geschrieben: Freitag 6. Januar 2023, 15:00 Die Beispieldateien ändere ich dann noch gegen variablen
Was soll das denn am Ende werden? Dieser Teil weckt den Verdacht, dass du womöglich dein Problem falsch angehst. Das weiß man aber erst genauer, wenn du mehr Background liefern würdest...
shoening
User
Beiträge: 19
Registriert: Donnerstag 20. Oktober 2011, 19:28

Hallo,

von Deiner Beschreibung würde ich annehmen, dass „Fortlaufend“ nicht technisch (im Sinne eines Streams) gemeint ist.

Wenn es Dir um eine (kleine: max. 100 Einträge) Datei z.B. mit privaten Kontakten geht, würde ich auch zu einer JSON Lösung greifen.

Dann solltest Du das folgendermaßen ändern:

Code: Alles auswählen

personen= [ {
"name": "Ich",
"telefon": 12345678,
"email": "ich@test.de"
} ]
(also aus Personen ein Array von Objekten machen)

Ich hoffe, das es hilft.
Benutzeravatar
sparrow
User
Beiträge: 4198
Registriert: Freitag 17. April 2009, 10:28

@shoening: Woran machst du denn die 100 Einträge fest? Und wie wird denn hier ein weiterer Eintrag an die Datei "angehängt"? Das letzte Zeichen in deiner Datei schließ ja das Array ab. Und der TE möchte ja mit jedem neuen Eintrag die Datei erweitern...
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

@sparrow: shoening meint wahrscheinlich, dass es bei kleinen Datenmengen keinen Unterschied macht, ob nun die komplette Datei gelesen und neu geschrieben wird, oder ob wirklich angehängt wird. Bei 4000 Bytes die ein Sektor typischerweise hat und einer Durchschnittsgrösse von 40 Zeichen pro Eintrag ist die Grenze 100 Einträge.
Namlus
User
Beiträge: 70
Registriert: Donnerstag 5. Januar 2023, 15:10

snafu hat geschrieben: Samstag 7. Januar 2023, 10:56
Namlus hat geschrieben: Freitag 6. Januar 2023, 15:00 Die Beispieldateien ändere ich dann noch gegen variablen
Was soll das denn am Ende werden? Dieser Teil weckt den Verdacht, dass du womöglich dein Problem falsch angehst. Das weiß man aber erst genauer, wenn du mehr Background liefern würdest...
Am Ende will ich unterschiedlichste Daten in unsere Kundenverwaltung einlesen. z.B. beginnend damit dass ich die Telefonbücher abgleiche (Damit fange ich klein an). Das prinzip ist ja immer das selbe, und in naher zukunft will ich auch die kompletten Emails importieren. Dazu muss ich aber erst mal eine Möglichkeit finden die Daten in ein importierbares Format zu schreiben.

Also, klein anfangen und dann darauf aufbauen. Jetzt geht es erst mal darum, dass ich es schaffe die Ersten Daten von A -> B zu bringen. Da mache ich Schritt für schritt. Ich probiere alles in "Beispieldateien aus" und wenn ein Schritt funktioniert, schreibe ich ihn bei dem eigentlichen Programm dazu.
Namlus
User
Beiträge: 70
Registriert: Donnerstag 5. Januar 2023, 15:10

shoening hat geschrieben: Samstag 7. Januar 2023, 13:46 Hallo,

von Deiner Beschreibung würde ich annehmen, dass „Fortlaufend“ nicht technisch (im Sinne eines Streams) gemeint ist.

Wenn es Dir um eine (kleine: max. 100 Einträge) Datei z.B. mit privaten Kontakten geht, würde ich auch zu einer JSON Lösung greifen.

Dann solltest Du das folgendermaßen ändern:

Code: Alles auswählen

personen= [ {
"name": "Ich",
"telefon": 12345678,
"email": "ich@test.de"
} ]
(also aus Personen ein Array von Objekten machen)

Ich hoffe, das es hilft.
Vielen Dank. Ja soweit war ich. Allerdings wenn jetzt 1 Eintrag dazukommt, dann kann ich den nicht einfach unten dazuschreiben oder?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein. Das geht mit JSON nicht. Geht aber mit CSV 🤷‍♂️
Namlus
User
Beiträge: 70
Registriert: Donnerstag 5. Januar 2023, 15:10

__deets__ hat geschrieben: Samstag 7. Januar 2023, 19:59 Nein. Das geht mit JSON nicht. Geht aber mit CSV 🤷‍♂️
Ja so habe ich das jetzt auch gelöst. Ich trenne die Werte einfach mit ; und exportiere es in eine TXT.
Die kann ich mit der Kundenverwaltung dann einlesen.
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

@Namlus: »unterschiedlichste Daten in unsere Kundenverwaltung« hört sich eher danach an, als ob Du tatsächlich mit einer Datenbank wie SQLite besser beraten wärst.
Daten zu schreiben, ist ja nur der eine Teil, wie sollen denn die Daten einmal verarbeitet werden? Was soll damit gemacht werden?

Nein, CSV ist keine einfache Text-Datei. Benutze dafür das csv-Modul.
Namlus
User
Beiträge: 70
Registriert: Donnerstag 5. Januar 2023, 15:10

Sirius3 hat geschrieben: Samstag 7. Januar 2023, 20:08 @Namlus: »unterschiedlichste Daten in unsere Kundenverwaltung« hört sich eher danach an, als ob Du tatsächlich mit einer Datenbank wie SQLite besser beraten wärst.
Daten zu schreiben, ist ja nur der eine Teil, wie sollen denn die Daten einmal verarbeitet werden? Was soll damit gemacht werden?

Nein, CSV ist keine einfache Text-Datei. Benutze dafür das csv-Modul.
Die Daten werden in eine Filemaker Datenbank geschrieben. Mit Filemaker kann ich Textdateien die mit ";" getrennt sind automatisch einlesen. - Somit erfüllt das seinen zweck. Das CSV Modul bringt mich zum verzweifeln.
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du mit etwas nicht weiter kommst, kannst Du hier ja eine Frage stellen.
nezzcarth
User
Beiträge: 1638
Registriert: Samstag 16. April 2011, 12:47

Namlus hat geschrieben: Samstag 7. Januar 2023, 20:25 Mit Filemaker kann ich Textdateien die mit ";" getrennt sind automatisch einlesen. - Somit erfüllt das seinen zweck. Das CSV Modul bringt mich zum verzweifeln.
Das geht so lange gut, wie z.B. kein Semikolon als regulärer Feldinhalt und auch keiner der anderen Sonderfälle auftritt. Das CSV Modul kümmert sich um so etwas. Die Einfachheit, die du dir scheinbar wünschst, wird es bei dem Anwendungsfeld, das du beschrieben hast, so nicht geben. Sobald man Daten strukturiert in eine Datei schreiben und strukturiert wieder herausbekommen möchte, ist das ein Dateiformat, das natürlich auch textbasiert sein kann. Und für die üblichen Formate, die dir ja vorgeschlagen wurden, gibt es existierende Bibliotheken, die man verwenden sollte, weil man es selbst eher nicht sauber implementieren wird. Da hilft nur, sich die Zeit zu nehmen und sich da einzuarbeiten. Alles andere wird nur Probleme machen und am Ende mehr Zeit beanspruchen.
Antworten