我如何用rumel . YAML在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('nn', line: 6, col: 12), None, None, None]})

其中seq.ca是注释属性。这样的属性不能是添加到正常列表中,因此至少对于数据结构的user部分您需要创建一个CommentedSeq实例。你也可以看到评论token由两个换行符(nn)组成。第一个换行符表示行结束符注释'a'后的第一个元素(由0表示)是空的,第二个换行符是在第二个"user"之前的实际空行。

然而,在第二个用户之前插入该行实际上更容易。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年了。

最新更新