如何在块中的新行之后开始列出密钥

时间:2019-05-29 09:15:03

标签: python yaml pyyaml

使用Python中内置的yaml包,是否有可能在列表指示符破折号之后转储从新行开始的列表项?

代替此结构:

root:
  - name: a
    id: 0
  - name: b
    id: 1

我需要以下结构:

root:
  -
    name: a
    id: 0
  -
    name: b
    id: 1

1 个答案:

答案 0 :(得分:0)

AFAIK PyYAML甚至不支持您指示的第一个输出:

import sys
import yaml as pyyaml

data = dict(root=[dict(name="a", id=0), dict(name="b", id=1)])
pyyaml.safe_dump(data, sys.stdout, default_flow_style=False, indent=4)

结果如下:

root:
-   id: 0
    name: a
-   id: 1
    name: b

您可以看到块顺序项目指示符(-)不是 在序列项的缩进内偏移,然后执行此操作和/或获取 多余的换行符,则必须更改PyYAML发射器的内部。

另一个内置的YAML库ruamel.yaml(免责声明:我是该程序包的作者)可以 完全按照自己的意愿做:

import sys
import ruamel.yaml

data = dict(root=[dict(name="a", id=0), dict(name="b", id=1)])

yaml = ruamel.yaml.YAML()
yaml.indent(sequence=4, offset=2)
yaml.compact_seq_map = False

yaml.dump(data, sys.stdout)

给出:

root:
  -
    name: a
    id: 0
  -
    name: b
    id: 1

顺便说一句,我不会叫PyYAML或ruamel.yaml 内置 你是说那个Python有一个标准库(随同 包括电池),例如包含一个JSON解析器。但是还有 标准库中没有YAML解析器。