如何使用 ruamel.yaml 在 YAML 中插入换行符?

How can I insert linebreak in YAML with ruamel.yaml?

这是我的代码

from ruamel.yaml import YAML

yaml = YAML()
user = [{"login":"login1","fullName":"First1 Last1", "list":["a"]},{"login":"login2","fullName":"First2 Last2", "list":["b"]}]
test = {"category":[{"year":2023,"users":user}]}
yaml.indent(mapping=4, sequence=4, offset=2)
yaml.width = 2048


with open(r'test.yml', 'w') as file:
    documents = yaml.dump(test, file)

我得到了这个 YAML 文件

category:
  - year: 2023
    users:
      - login: login1
        fullName: First1 Last1
        list:
          - a
      - login: login2
        fullName: First2 Last2
        list:
          - b

我需要在两个用户之间插入一个换行符(最终的 YAML 应该是这样的)

category:
  - year: 2023
    users:
      - login: login1
        fullName: First1 Last1
        list:
          - a

      - login: login2
        fullName: First2 Last2
        list:
          - b

如何添加这个空行?

您应该在 ruamel.yaml 中加载您想要的结果。为了好的措施,你可以 然后将其转储回去以查看是否保留了额外的行。如果不是,你可能不会 能够在第一时间写出这样的格式。正如您将看到的,额外的行是 保留,所以如果你 可以从头重建加载的数据。

ruamel.yaml 通常会将注释附加到刚刚解析的节点,所以 您应该调查作为第一个键 'list':

值的序列
import sys
import ruamel.yaml

yaml_str = """\
category:
  - year: 2023
    users:
      - login: login1
        fullName: First1 Last1
        list:
          - a

      - login: login2
        fullName: First2 Last2
        list:
          - b
"""

yaml = ruamel.yaml.YAML()
# yaml.indent(mapping=4, sequence=4, offset=2)
# yaml.preserve_quotes = True
data = yaml.load(yaml_str)
# yaml.dump(data, sys.stdout)
seq = data['category'][0]['users'][0]['list']
print('seq', type(seq), seq.ca)

给出:

seq <class 'ruamel.yaml.comments.CommentedSeq'> Comment(comment=None,
  items={0: [CommentToken('\n\n', line: 6, col: 12), None, None, None]})

其中seq.ca是评论属性。这样的属性不能 添加到普通列表中,因此至少对于数据结构的那部分 user 您需要创建一个 CommentedSeq 实例。也可以看到评论 token 包含两个换行符 (\n\n)。第一个换行符表示行尾 'a' 后面的注释第一个元素(由 0 表示)为空,第二个 换行符是您在第二个“用户”之前的实际空行。

然而,在第二个用户之前插入该行实际上更容易。 CommentedSeq 实例有 一种允许您在键前添加注释的方法(在本例中键是元素索引):

import sys
import ruamel.yaml
CS = ruamel.yaml.comments.CommentedSeq

yaml = ruamel.yaml.YAML()

user = CS([{"login":"login1","fullName":"First1 Last1", "list":["a"]},{"login":"login2","fullName":"First2 Last2", "list":["b"]}])
user.yaml_set_comment_before_after_key(1, before='\n')
test = {"category":[{"year":2023,"users":user}]}
yaml.indent(mapping=4, sequence=4, offset=2)
yaml.width = 2048


documents = yaml.dump(test, sys.stdout)

给出:

category:
  - year: 2023
    users:
      - login: login1
        fullName: First1 Last1
        list:
          - a

      - login: login2
        fullName: First2 Last2
        list:
          - b

确保修复安装中使用的 ruamel.yaml 版本, yaml_set_comment_before_after_key 之类的例程可能仍会更改。

测试的时候我一般写到stdout,比较容易看输出是否正确。 如果将 YAML 文档写入文件,则应考虑使用扩展名 .yaml,至少 15 年来,它一直是此类文件的推荐扩展名。