2013-02-13 1 views
10

Я только что начал использовать PyYAML для преобразования некоторых данных.Отключить преобразование значения PyYAML

Я просто использую функцию yaml.load, и это было достаточно хорошо для меня, пока я не заметил, что он пытается преобразовать все значения в уникодированную строку, int, даты и так далее.

Это может быть фатально в моем приложении, есть ли способ избежать этого преобразования? Я хотел бы получить все как строки. Я посмотрел на конструкторы и не смог найти способ отключить это преобразование.

обновление: Что я получаю от yaml.load является OrderedDict и все выглядит хорошо. единственная проблема заключается в том, что некоторые значения являются строками, а некоторые - int. Я хотел бы иметь все значения как строки. Я не хочу, чтобы pyyaml ​​менял значения для меня.

+0

Тогда вы не декодирования YAML. Кроме того, ** что именно ** вы хотите оставить как струны, а что нет? Если вы оставите * все * строку, вы хотите 'the_file.read()' ;-) – delnan

+0

Файл, который я использую pyyaml ​​для разбора, на самом деле не yaml, но он достаточно близко. Поэтому я хочу избежать преобразования типов. – theAlse

+0

но * какой * вид type изменение? Вы хотите получать списки? Словари? Вы хотите, чтобы булевы были преобразованы? Плавает? На произвольную глубину или с фиксированным форматом? Как бы то ни было, это слишком недооценивается. – delnan

ответ

22

Ну, вы могли бы использовать Loader=yaml.BaseLoader оставить все как строку:

>>> 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

Остерегайтесь: в то время как это отключает автоматическое преобразование значений, также кажется, что ключ слияния «<<» больше не работает на более чем одном уровне (т. Е. «<<» - слияние узла привязки, который сам также «<< «- добавляет другие опорные узлы больше не будет работать» - протестировано на PyYAML 3.10 и 3.11 – voetsjoeba

Смежные вопросы