Отключить преобразование значений PyYAML

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

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

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

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


person theAlse    schedule 13.02.2013    source источник
comment
Тогда вы не декодируете YAML. Кроме того, что именно вы хотите оставить в виде строк, а что нет? Если вы оставите все строку, вам нужно the_file.read() ;-)   -  person    schedule 13.02.2013
comment
Файл, который я использую для анализа с помощью pyyaml, на самом деле не yaml, но он достаточно близок. Поэтому я хочу избежать преобразования типов.   -  person theAlse    schedule 14.02.2013
comment
Но какое преобразование типов? Хотите получать списки? Словари? Вы хотите, чтобы логические значения были преобразованы? Поплавки? На произвольную глубину или с фиксированным форматом? В нынешнем виде это слишком мало указано.   -  person    schedule 14.02.2013
comment
@delnan, пожалуйста, ознакомьтесь с обновленной информацией   -  person theAlse    schedule 14.02.2013
comment
В качестве примера предположим, что у вас есть структура данных, в которой двухбуквенный код местоположения исторически помещался в YAML без кавычек, и вы хотите, чтобы код местоположения on не преобразовывался в True.   -  person John Keith Hohm    schedule 29.01.2016
comment
Вам нужны только значения (т.е. скаляры, которые являются значениями в отображении), или вам также нужны ключи или элементы последовательности, которые являются скалярами, которые преобразуются, чтобы храниться в виде строк.   -  person Anthon    schedule 06.12.2018


Ответы (1)


Ну, вы можете использовать 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'}]
person DSM    schedule 13.02.2013
comment
Осторожно: хотя это отключает автоматическое преобразование значений, это также приводит к тому, что клавиша слияния ‹‹ больше не работает более чем на одном уровне (т. больше не работает) -- проверено на PyYAML 3.10 и 3.11 - person voetsjoeba; 28.01.2016
comment
Это также приводит к тому, что ключи и элементы (последовательности) создаются как строки, а не только скалярные значения в документе YAML. - person Anthon; 06.12.2018