如何从纯python创建一个yaml文件?

时间:2012-02-03 20:48:42

标签: python yaml pyyaml

来自Using YAML with 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

直接从纯python构建YAML文件的正确方法是什么?我不想自己写字符串。我想建立字典和列表。


...偏

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

3 个答案:

答案 0 :(得分:7)

还好。我只是仔细检查了文档。我们在yaml.dump(data, optional_args)

的末尾需要这个

修复就是这个

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

其中dataMap是源yaml.load(),f是要写入的文件。

答案 1 :(得分:1)

答案 2 :(得分:1)

假设您正在使用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的增强版本完成的。