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]}]
我有一个 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]}]