pyyaml 输出不正确

improper output with pyyaml

我有一个 YAML 文件,test.yaml:

test:
  server_group_1:
    type: OS::Nova::ServerGroup
    properties:
      name: { get_param: [server_groups, 5] }
      policies: [ { get_param: [server_group_types, 5] } ]

当我使用 PyYAML 读取和打印输出时,它给出了低于输入的输出,这与输入不同

test:
  server_group_1:
    properties:
      name:
        get_param:
        - server_groups
        - 5
      policies:
      - get_param:
        - server_group_types
        - 5
    type: OS::Nova::ServerGroup

代码:

import yaml
print yaml.dump(yaml.load(open('/test.yaml')), default_flow_style=False)

我想要输出和输入一样,这里的顺序也变了

你的 PyYAML 短代码有几个问题,与映射中键的顺序无关(PyYAML 总是排序)。

几乎不需要在没有 Loader 参数的情况下使用 PyYAML 的 load(),这被记录为不安全的。而且您未能向 dump() 提供流参数,这会导致输出被写入内存、检索,然后您 print 它。如果您想试验 PyYAML,您应该只使用 dump(yaml.safe_load(open('/test.yaml')), sys.stdout, default_flow_style=False)


虽然可以将 PyYAML 映射加载为 Python 有序字典,但这并不简单。

问题更大的是嵌套流样式,例如{get_param: [server_groups, 5]} 其中流样式列表嵌套在流样式映射中。流样式的 PyYAML 控件是以下三种之一:根本没有流样式,或者一切都是流样式,或者所有叶节点流样式。

你应该看看 ruamel.yaml(免责声明:我是那个包的作者)你可以在哪里做:

import sys
import ruamel.yaml

yaml = ruamel.yaml.YAML()

with open('test.yaml') as fp:
    data = yaml.load(fp)
yaml.dump(data, sys.stdout)

这保留了键顺序,并且在所有级别都保留了流样式。唯一无法控制的是额外的空格 after/before 流式大括号和不一致的额外空格 after/before 流式方括号。

使用上面的代码你得到:

test:
  server_group_1:
    type: OS::Nova::ServerGroup
    properties:
      name: {get_param: [server_groups, 5]}
      policies: [{get_param: [server_group_types, 5]}]