Nested Dict parsen

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.
Antworten
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

Hallo zusammen,

ich möchte eine Datei parsen, die verschachtelte Dicts in folgender Form enthält:

Code: Alles auswählen

{"einDict":[
{
    "wert1":"907",
    "wert2":"2",
    "einUnterDict":
    {
        "wert1":"122361732",
        "wert2":"2020-09-01T11:01:55.382+02:00",
        "wert3":"2020-09-01T11:01:55.000+02:00",
        "einUnterUnterDict":
        {
            "wert1":"blub",
            "wert2":"122361732",
            "title":"Blah",
        },
    }
}]}
Etwas Recherche hat mich darauf gestoßen, das pyparsing dafür ein geeignetes Werkzeug ist. Leider kenne ich mich damit bisher kaum aus und die Dokumentation dafür finde ich nicht so gelungen.
Was ich gerne tun würde ist die Dicts in die entsprechende Python-dict-Struktur zu überführen. Dabei gibt es einige Hürden zu nehmen:
  • Die Anführungszeichen vor den Strings müssen entfernt werden
  • Die Schachtelung wird durch geschweifte Klammern erzeugt. Dazwischen gibt es (unregelmäßig) eckige Klammern, die ignoriert werden können
  • Die Stuktur hat potenziell beliebig viele Unterebenen
Mein bisheriger Ansatz sieht so aus:

Code: Alles auswählen

import pyParsing as pp
string='"{einDict":[{"wert1":"907","wert2":"2","einUnterDict":{"wert1":"122361732","wert2":"2020-09-01T11:01:55.382+02:00","wert3":"2020-09-01T11:01:55.000+02:00","einUnterUnterDict":{"wert1":"blub","wert2":"122361732","title":"Blah",},}}]}'
meindict = pp.OneOrMore(pp.nestedExpr('{','}')).parseString(string)
meindict
([(['"einDict"', ':[', (['"wert1"', ':', '"907"', ',', '"wert2"', ':', '"2"', ',', '"einUnterDict"', ':', (['"wert1"', ':', '"122361732"', ',', '"wert2"', ':', '"2020-09-01T11:01:55.382+02:00"', ',', '"wert3"', ':', '"2020-09-01T11:01:55.000+02:00"', ',', '"einUnterUnterDict"', ':', (['"wert1"', ':', '"blub"', ',', '"wert2"', ':', '"122361732"', ',', '"title"', ':', '"Blah"', ','], {}), ','], {})], {}), ']'], {})], {})
Ich bin für Tipps dankbar wie ich hier am Besten weiter mache. Ich habe noch nie eine Grammatik formuliert.
Sirius3
User
Beiträge: 18261
Registriert: Sonntag 21. Oktober 2012, 17:20

Woher kommt denn dieses Format? Bis auf ein paar Kommas zu viel sieht das fast wie JSON aus. Wenn Du Einfluß auf das Schreiben hast, dann schreibe richtiges JSON. Oder hast Du das Beispiel nur erfunden, und in Wirklichkeit ist es JSON?
Ansonsten gibt es ast.literal_eval, falls es sich aus irgend einem Grund tatsächlich um Python-Dicts handelt. Wäre aber sehr unschön, ein nicht-standardisiertes Format zum Speichern von Daten zu verwenden.
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

Das kommt von einer Website, ich habe also keinen Einfluß auf das Format. Da ich JSON nicht kenne kann ich dazu nichts sagen, das schaue ich mir mal an.
Das Beispiel habe ich quasi 1:1 so übernommen wie ich es dort abfrage.

Edit: Habe mir das JSON-Format angeschaut. Die beiden Kommas zu viel in meinem Beispiel können durch dadurch zustande kommen, dass ich das Beispiel falsch gekürzt habe. Ich vermute die Daten sind JSON - ich prüfe das aktuell.
Zuletzt geändert von BastiL am Donnerstag 3. September 2020, 07:31, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 18261
Registriert: Sonntag 21. Oktober 2012, 17:20

BastiL hat geschrieben: Donnerstag 3. September 2020, 07:13Das Beispiel habe ich quasi 1:1 so übernommen wie ich es dort abfrage.
Das glaube ich nicht ganz. Denn wenn es von einer Webseite kommt, dann ist das zu 99.999%iger Wahrscheinlichkeit JSON. Mach Dich damit vertraut.
Und requests, mit dem Du hoffentlich die Daten abfragst, kann das von sich aus.
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

Die beiden Kommas zu viel in meinem Beispiel können durch dadurch zustande kommen, dass ich das Beispiel falsch gekürzt habe. Ich vermute die Daten sind JSON - ich prüfe das aktuell. Und ja ich nutze requests zur Abfrage. Vielen Dank für die Hilfe.
BastiL
User
Beiträge: 135
Registriert: Montag 7. Juli 2008, 20:22

Ok gelöst - das ist JSON. Das Stichwort hat mir sehr geholfen.
Antworten