Seite 1 von 1

Nested Dict parsen

Verfasst: Donnerstag 3. September 2020, 06:50
von BastiL
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.

Re: Nested Dict parsen

Verfasst: Donnerstag 3. September 2020, 07:07
von Sirius3
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.

Re: Nested Dict parsen

Verfasst: Donnerstag 3. September 2020, 07:13
von BastiL
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.

Re: Nested Dict parsen

Verfasst: Donnerstag 3. September 2020, 07:23
von Sirius3
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.

Re: Nested Dict parsen

Verfasst: Donnerstag 3. September 2020, 07:33
von BastiL
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.

Re: Nested Dict parsen

Verfasst: Donnerstag 3. September 2020, 09:10
von BastiL
Ok gelöst - das ist JSON. Das Stichwort hat mir sehr geholfen.