如何使用纯 Python 创建一个 YAML 文件?

9

来自使用 Python 的 YAML

原始的 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'
                 }
               }
          }

1
你是在问如何确保输出的文件与输入的文件相同吗?如果是的话,那么无法保证,因为字典没有预定义的顺序。 - Nate
@Nate,没错,这是我的意图。我明白了。我编辑并提供了部分结构。Yaml dumps无法将内部的{name: Node 1-1}解析为另一层.... - CppLearner
3个回答

8

好的。我刚刚仔细检查了文档。我们需要将以下内容添加到yaml.dump(data, optional_args)函数的末尾。

修改如下:

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

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


2
这个转储不会写入 #tree format 注释。 - Anthon

2
假设您正在使用 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 的增强版本,我是它的作者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接