Nested Dict parsen
Verfasst: Donnerstag 3. September 2020, 06:50
Hallo zusammen,
ich möchte eine Datei parsen, die verschachtelte Dicts in folgender Form enthält:
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:
Ich bin für Tipps dankbar wie ich hier am Besten weiter mache. Ich habe noch nie eine Grammatik formuliert.
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",
},
}
}]}
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
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"', ','], {}), ','], {})], {}), ']'], {})], {})