Daten in Stringform automatisch in passenden Typ umwandeln

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
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Hallo,

bevor ich mich totsuche bzw. anfange, mir eine eigene Lösung dafür zu schreiben: Ich habe eine XML-Datei, die ich mittels eines Parsers in ein Dict einlese. Klappt so weit ganz gut, nur daß die ganzen Werte logischerweise in Stringform vorliegen. Diese Werte können praktisch leider alles mögliche sein - von Strings über Ints und Floats bis hin zu Daten im DIN-Format (yyyy-mm-dd).
Jetzt wäre es natürlich klasse, wenn sich diese Strings mittels eines oder zumindest weniger Befehle in einen passenden Datentyp umwandeln ließen.
Bisher bin ich nur auf eval() gestoßen, das zwar Zahlen wunderbar umwandelt, aber mit "echten" Strings und Daten Probleme hat: Bei ersteren versucht es (was ja wohl auch seine Aufgabe ist), den String als Python-Code zu interpretieren, bei letzteren interpretiert sie den String als Rechenaufgabe.
Frage: Gibt es zufällig schon eine eingebaute Lösung, oder muß ich mir mittels re einen entsprechenden Konverter basteln?

Schönen Gruß

Jan-Peer
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Jan-Peer hat geschrieben:Ich habe eine XML-Datei, die ich mittels eines Parsers in ein Dict einlese. Klappt so weit ganz gut, nur daß die ganzen Werte logischerweise in Stringform vorliegen. Diese Werte können praktisch leider alles mögliche sein - von Strings über Ints und Floats bis hin zu Daten im DIN-Format (yyyy-mm-dd).
Jetzt wäre es natürlich klasse, wenn sich diese Strings mittels eines oder zumindest weniger Befehle in einen passenden Datentyp umwandeln ließen.
wenn es so ist, dass die strings immer gültiger pythoncode wären, und Sicherheit kein Thema ist (eval is evil), könntest du tatsächlich eval verwenden.
2007-11-18 ist aber kein gültiges python, also...
Bisher bin ich nur auf eval() gestoßen, das zwar Zahlen wunderbar umwandelt,
könntest du für zahlen die funktionen int und float nutzen, strings sind halt strings, und für daten gibts sicher eine unterhalb von datetime.
Frage: Gibt es zufällig schon eine eingebaute Lösung, oder muß ich mir mittels re einen entsprechenden Konverter basteln?
Eingebaute Lösungen gibt es in sofern, als dass man pickle nutzen könnte, wenn man die xml-dateien nicht nur liest, sondern auch schreibt. Sonst kenne ich allerdings keine.
BlackJack

Natürlich ist '2007-11-18' gültiger Python-Code. ;-)

Code: Alles auswählen

In [361]: 2007-11-18
Out[361]: 1978
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

BlackJack hat geschrieben:Natürlich ist '2007-11-18' gültiger Python-Code. ;-)

Code: Alles auswählen

In [361]: 2007-11-18
Out[361]: 1978
Punkt für dich ;)
Eigentlich hätte ich es besser wissen müssen, ich hatte mal exakt dieses problem bei mysql (unescapedtes datum).
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Nun gut, dann werde ich mir einen eigenen Konverter basteln. Der Aufwand dürfte sich in Grenzen halten. Das eval aus Sicherheitsgründen indiskutabel ist, war mir schon vor dem ersten Post klar (aber offensichtlich habe ich es nicht deutlich genug aufgeführt). Pickle wäre eine denkbare Lösung, aber da ich mir die Möglichkeit offenhalten möchte, den Dateiinhalt auch mit anderen Programmen als dem meinen abzugreifen, wird sie sicherlich auch nicht zum Zuge kommen.

Danke für Eure Antworten.

P.S.: Trotzdem erstaunlich, daß es dafür nichts eingebautes gibt - soo exotisch kommt mir die Aufgabenstellung gar nicht vor.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

P.S.: Trotzdem erstaunlich, daß es dafür nichts eingebautes gibt - soo exotisch kommt mir die Aufgabenstellung gar nicht vor.
Ich würde die Aufgabenstellung mal so auslegen: Ich möchte ein von mir definiertes XML-Format in eine von mir definierte Struktur parsen.
Das ist schon recht spezifisch, wenn auch nicht exotisch.
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Eigentlich eher: Ich habe einen String aus einer Datei (zufällig XML), und möchte diesen in den richtigen Typ konvertieren, ohne diesen Typ vorher zu kennen. Genutzt wird das ganze in einem Framework, um beliebige Programmvariablen abzuspeichern. Von daher wäre Pickle an sich eine gute Idee, ich möchte aber trotzdem bei "reinem" XML bleiben.
BlackJack

Wenn beliebig hier wirklich beliebig meint, musst Du den Typ mitspeichern. Sonst schreibt am Ende jemand die Zeichenkette '42' und bekommt eine 42 zurück, oder bei einer Telefonnummer eine Zahl oder bei einer Postleitzahl… Oder bei der Zeichenkette '1-2-3' gibt's beim Einlesen plötzlich ein Datum.

Einer der Gründe warum es das noch nicht fertig gibt ist vielleicht das falsch "geraten" werden kann und das ist "unpythonisch". Aus dem Zen of Python: “In the face of ambiguity, refuse the temptation to guess”.
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Klingt einleuchtend.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Ich habe einen String aus einer Datei (zufällig XML), und möchte diesen in den richtigen Typ konvertieren, ohne diesen Typ vorher zu kennen. Genutzt wird das ganze in einem Framework, um beliebige Programmvariablen abzuspeichern. Von daher wäre Pickle an sich eine gute Idee, ich möchte aber trotzdem bei "reinem" XML bleiben.
Ich habs gerade nicht gefunden, aber ich meine, man kann pickle dazu bringen, die Ausgabe nicht in diesem strangen pickle-Format, sondern als xml zu speichern.
BlackJack

Das Pickle-Modul aus der Standardbibliothek kann das nicht, aber man findet im Netz Module die als XML serialisieren.
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Gut, dann werde ich bei Gelegenheit mal danach suchen. Besten Dank erst einmal ...
Antworten