Записать YAML-файл из python dict, содержащего специальные символы (звездочка, амперсанд, *, &) - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть файл YAML, который мне нужно импортировать в python, обработать его каким-либо образом, а затем снова экспортировать как файл YAML. Точнее, я импортирую файл конфигурации YAML как файл, создаю много файлов с изменяющимися параметрами, а затем снова записываю их как файлы YAML.

Проблема, с которой я сталкиваюсь, состоит в том, что существуют параметры со специальными символами ($, &) перед ними: например, * target_size.

Когда я работаю с dict в python, тогда этот параметр является значением словаря в строковом формате ('* target_size'). Когда я пишу этот диктат, поскольку форматирование файла YAML сохраняется, то есть '* target_size' окружается кавычками в результирующем файле YAML. Что мне нужно, это просто * target_size, такой же, как в оригинальном файле.

Я просмотрел документы pyYaml и другие ресурсы, но не нашел решения.

Код для записи файла YAML:

    with open(f'{PATH}/base_config.yml', 'w') as outfile:
         yaml.dump(config, outfile, default_flow_style=False, sort_keys=False)

original YAML python dict resulting file

1 Ответ

3 голосов
/ 24 апреля 2020

Звездочка (*) и амперсанд (&) без кавычек - это специальные символы в YAML, представляющие псевдонимы и якоря . Они позволяют одной части документа YAML ссылаться на другую часть документа YAML.

Когда вы десериализуете документ YAML в структуру данных Python, вы теряете любую информацию о якорях и псевдонимах, которые присутствовали в исходный документ.

Когда вы сериализуете структуру данных Python в YAML, модуль yaml автоматически генерирует привязки и псевдонимы, где это необходимо, для представления структур со ссылками на себя. Например, учитывая это:

>>> import yaml
>>> doc = {'a': {'example': 'this is a test'}}
>>> doc['b'] = doc['a']
>>> print(yaml.safe_dump(doc))

Мы видим следующий вывод:

a: &id001
  example: this is a test
b: *id001

Вы не сможете сохранить их в конвейере десериализации / сериализации с использованием стандартного Python yaml модуль.

...