Seite 1 von 1

Daten in Stringform automatisch in passenden Typ umwandeln

Verfasst: Donnerstag 15. November 2007, 21:32
von Jan-Peer
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

Re: Daten in Stringform automatisch in passenden Typ umwande

Verfasst: Freitag 16. November 2007, 14:14
von keppla
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.

Verfasst: Freitag 16. November 2007, 14:27
von BlackJack
Natürlich ist '2007-11-18' gültiger Python-Code. ;-)

Code: Alles auswählen

In [361]: 2007-11-18
Out[361]: 1978

Verfasst: Freitag 16. November 2007, 14:29
von keppla
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).

Verfasst: Freitag 16. November 2007, 14:41
von Jan-Peer
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.

Verfasst: Freitag 16. November 2007, 15:01
von keppla
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.

Verfasst: Freitag 16. November 2007, 15:35
von Jan-Peer
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.

Verfasst: Freitag 16. November 2007, 15:45
von 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”.

Verfasst: Freitag 16. November 2007, 15:48
von Jan-Peer
Klingt einleuchtend.

Verfasst: Freitag 16. November 2007, 15:56
von keppla
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.

Verfasst: Freitag 16. November 2007, 16:10
von BlackJack
Das Pickle-Modul aus der Standardbibliothek kann das nicht, aber man findet im Netz Module die als XML serialisieren.

Verfasst: Freitag 16. November 2007, 18:03
von Jan-Peer
Gut, dann werde ich bei Gelegenheit mal danach suchen. Besten Dank erst einmal ...