YAML中序列的特定格式

时间:2018-10-15 15:46:27

标签: ruamel.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

1 个答案:

答案 0 :(得分:0)

从本质上讲,这是两个问题:第一个是如何预防的 获取默认的紧凑表示形式,第二个使用 不同的序列有不同的压痕。

从第一个开始:您可以使用.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