首页 > 解决方案 > YAML 中序列的特定格式

问题描述

是否可以使用 ruamel.yaml 以以下格式输出序列:

-
  key1: 1
  key2: 2
  key3: 3

而不是标准

- key1: 1
  key2: 2
  key3: 3

...和这个

- skills:
    - Python
    - Perl

而不是标准...

- skills:
  - Python
  - Perl

第二个例子是yaml.indent(sequence = 4, offset = 2)应该做什么。但是顶级列表也会缩进:

  - skills:
      - Python
      - Perl

标签: ruamel.yaml

解决方案


这本质上是两个问题:第一个是关于如何防止获得默认的紧凑表示,第二个是关于对不同的序列使用不同的缩进。

从第一个开始:您可以使用以下.compact()方法来实现(确保已ruamel.yaml>=0.15.73安装):

import sys
import ruamel.yaml

yaml_str = """\
-
  key1: 1
  key2: 2
  key3: 3
"""

yaml = ruamel.yaml.YAML()
yaml.compact(seq_map=False)
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)

这使:

-
  key1: 1
  key2: 2
  key3: 3

如果您不希望序列中的紧凑序列(看起来像) ,您还可以提供seq_seq=False作为参数.compact()- - abc


第二个是不可能开箱即用的,因为缩进(和压缩)总是适用于所有序列。映射,甚至到根级序列。

最好的方法是使用变换函数:

import sys
import ruamel.yaml

yaml_str = """\
- skills:
  - Python
  - Perl
"""

def dedent2(s):
    return ''.join([x[2:] if x.startswith('  ') else x for x in s.splitlines(True)])

yaml = ruamel.yaml.YAML()
yaml.indent(sequence=4, offset=2)
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout, transform=dedent2)

这使:

- skills:
    - Python
    - Perl

推荐阅读