2013-02-13 7 views
10

Ich habe gerade begonnen, PyYAML zu verwenden, um einige Daten zu konvertieren.Deaktivieren PyYAML Wert Umwandlung

Ich benutze einfach die yaml.load Funktion und es war gut genug für mich, bis ich bemerkte, dass es versucht, alle Werte in uni-codierte Zeichenfolge, Int, Daten und so weiter zu konvertieren.

Dies könnte in meiner Anwendung fatal sein, gibt es eine Möglichkeit, diese Konvertierung zu vermeiden? Ich möchte alles als Zeichenfolgen erhalten. Ich schaute auf die Konstruktoren und konnte keine Möglichkeit finden, diese Konvertierung zu deaktivieren.

update: Was ich von yaml.load bekomme ist ein OrderedDict und alles sieht gut aus. Das einzige Problem ist, dass einige Werte string sind und einige int. Ich möchte alle Werte als Zeichenfolgen haben. Ich möchte nicht, dass Pyyaml ​​die Werte für mich umrechnet.

+0

Dann bist du nicht YAML Decodierung. Außerdem, was genau willst du als Strings verlassen und was nicht? Wenn du * alles * eine Zeichenkette belässt, willst du 'the_file.read()' ;-) – delnan

+0

Die Datei, die ich zum Parsen mit pyyaml ​​verwende, ist eigentlich nicht yaml, aber es ist nahe genug. Daher möchte ich die Typumwandlung vermeiden. – theAlse

+0

Aber * was * Art der Typkonvertierung? Willst du Listen erhalten? Wörterbücher? Möchten Sie, dass Booleans konvertiert werden? Schwimmt? Zu beliebiger Tiefe oder mit einem festen Format? Wie es aussieht, ist dies viel zu wenig spezifiziert. – delnan

Antwort

22

Nun, könnten Sie Loader=yaml.BaseLoader verwenden, um alles als String zu verlassen:

>>> x = [[1,2,3], {1:2}] 
>>> s = yaml.dump(x) 
>>> s 
'- [1, 2, 3]\n- {1: 2}\n' 
>>> yaml.load(s) 
[[1, 2, 3], {1: 2}] 
>>> yaml.load(s, Loader=yaml.BaseLoader) 
[[u'1', u'2', u'3'], {u'1': u'2'}] 
+1

Achtung: dies verhindert zwar die automatische Konvertierung von Werten, es scheint aber auch zu sein, dass der Mischschlüssel "<<" nicht mehr als eine Ebene durchläuft (zB "<<" - ein Ankerknoten, der auch "<<" ist "-Verleiht andere Ankerknoten nicht mehr" - Getestet auf PyYAML 3.10 und 3.11 – voetsjoeba