【问题标题】:How to start listing keys after a new line in a block如何在块中的新行之后开始列出键
【发布时间】:2019-10-14 20:36:08
【问题描述】:

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

代替这种结构:

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

我需要以下结构:

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

【问题讨论】:

  • 你为什么想要那个?
  • 主要是可读性,当块远离每个块时,更容易阅读块中的项目。

标签: python yaml pyyaml


【解决方案1】:

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 built-in,无论如何 你的意思是。 Python 有一个标准库(因为它带有 包括电池),例如包含一个 JSON 解析器。但是还有 标准库中没有 YAML 解析器。

【讨论】:

  • 使用下面的代码可以修复缩进,但不是换行问题 class MyDumper(yaml.Dumper): def increase_indent(self, flow=False, indentless=False): return super(MyDumper , self).increase_indent(flow, False) #bysomeoneonstackoverflow
  • 嗯,这就是我所说的改变内部结构的意思:对于 PyYAML 的 dump() 例程,没有简单的选择。
猜你喜欢
  • 1970-01-01
  • 2020-06-22
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
  • 2014-09-08
相关资源
最近更新 更多