Как я могу создать файл yaml из чистого Python? - PullRequest
8 голосов
/ 04 февраля 2012

Пример из Использование YAML с Python

Оригинальный файл YAML содержит это

# tree format
treeroot:
    branch1:
        name: Node 1
        branch1-1:
            name: Node 1-1
    branch2:
        name: Node 2
        branch2-1:
            name: Node 2-1

После загрузки содержимого из файла с помощью yaml.load() и выгрузки его в новый файл YAML вместо этого я получаю:

# tree format
treeroot:
    branch1:
        branch1-1: {name:Node 1-1}
        name: Node 1
    branch2:
        branch2-1: {name: Node 2-1}
        name: Node 2

Как правильно создать файл YAML прямо из чистого питона? Я не хочу писать строки сам. Я хочу построить словарь и список.


Частичное ...

dataMap = {'treeroot':
               {'branch2': 
                 {'branch1-1': 
                  {'name': 'Node 1-1'},   # should be its own level
                  'name': 'Node 1'
                 }
               }
          }

Ответы [ 3 ]

7 голосов
/ 04 февраля 2012

Окей.Я просто дважды проверил документацию.Нам нужно это в конце yaml.dump(data, optional_args)

Исправление это

yaml.dump(dataMap, f, default_flow_style=False)

, где dataMap - источник yaml.load(), а f - файл для записи.

1 голос
/ 01 июля 2015

Предполагая, что вы используете PyYAML, как вы, вероятно, выводите, что вы выводите , а не копирование-вставка того, что yaml.dump() сгенерировано, поскольку оно содержит комментарий, а PyYAML их не пишет.

Если вы хотите сохранить этот комментарий, а также, например, порядок ключей в файле (хорошо, когда вы сохраняете файл в системе контроля версий), используйте ¹:

import ruamel.yaml as yaml

yaml_str = """\
# tree format
treeroot:
    branch1:
        name: Node 1
        branch1-1:
            name: Node 1-1   # should be its own level
    branch2:
        name: Node 2
        branch2-1:
            name: Node 2-1
"""

data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)
print yaml.dump(data, Dumper=yaml.RoundTripDumper, indent=4)

, который получает точно вход:

# tree format
treeroot:
    branch1:
        name: Node 1
        branch1-1:
            name: Node 1-1   # should be its own level
    branch2:
        name: Node 2
        branch2-1:
            name: Node 2-1

¹ Это было сделано с использованием ruamel.yaml расширенной версии PyYAML, автором которой я являюсь.

1 голос
/ 04 февраля 2012

Ваш первый и второй списки эквивалентны, просто разные обозначения.

См .: http://en.wikipedia.org/wiki/YAML#Associative_arrays и http://pyyaml.org/wiki/PyYAMLDocumentation#Dictionarieswithoutnestedcollectionsarenotdumpedcorrectly

...