Как создать файл yaml из pure python?

пример использование 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 прямо из чистого python? Я не хочу сам писать строки. Я хочу построить словарь и список.


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

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

3 ответов


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

исправить это

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

где dataMap является источником yaml.load() и f-это файл, в который нужно записать.


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

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


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

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

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

1 это было сделано используя ruamel.и YAML Расширенная версия PyYAML, автором которой я являюсь.