【问题标题】:How can I create a yaml file from pure python?如何从纯 python 创建 yaml 文件?
【发布时间】:2012-02-26 11:05:10
【问题描述】:

来自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'
                 }
               }
          }

【问题讨论】:

  • 您是在问如何保证输出与输入相同的文件?如果是这样,则无法保证,因为字典没有预定义的顺序。
  • @Nate 对,这就是我的意图。我明白那个。我编辑并提供了部分结构。 Yaml 转储无法将内部 {name: Node 1-1} 解析到另一个级别....

标签: python yaml pyyaml


【解决方案1】:

好的。我只是仔细检查了文档。我们在yaml.dump(data, optional_args)的末尾需要这个

解决办法是这样的

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

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

【讨论】:

  • 这个转储不写#tree format评论。
【解决方案2】:

假设您可能正在使用 PyYAML,那么您显示的输出是 not 复制粘贴 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 的增强版本。

【讨论】:

    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2016-09-03
      • 1970-01-01
      • 2012-02-02
      • 2019-04-07
      • 2011-12-19
      • 1970-01-01
      • 2016-07-17
      • 2018-08-08
      • 1970-01-01
      相关资源
      最近更新 更多