Как создать файл 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, автором которой я являюсь.