如何在ruamel中保留评论

时间:2018-12-19 10:16:26

标签: python pyyaml ruamel.yaml

我需要对带有评论的YAML文件进行排序。我正在使用ruamel.yaml库来保留来自YAML的评论,但是当我对项目进行排序时,评论会放在错误的位置。

people = """\
# manager of project
- title: manager

# owner of company
- title: owner
"""

import ruamel.yaml, sys

yaml = ruamel.yaml.YAML()
arr = yaml.load(people)
arr  = sorted(arr, key=lambda x: x['title'])
yaml.dump(arr, sys.stdout)

使用此代码,我得到以下输出:

- title: manager

# owner of company
- title: owner

在排序时,第一个元素的注释消失了。我如何保留列表的第一条评论?

1 个答案:

答案 0 :(得分:1)

您在文档开头的第一条评论没有 之前的节点,并在arr对象(这是 类型ruamel.yaml.comments.CommentedSeq)。您可以通过以下方式检查 直接在之后执行print(arr.ca)(用于注释属性) 正在加载。

加载后,字典上附加了第二个注释属性 由映射arr[0]和第三个注释构成的类似对象 属性附加到由arr[1](在 与第一个评论附加到arr的方式几乎相同。

排序操作未完成,因此仅 与排序的元素相关联的注释保持不变。的 分配结果(简单的arr)后list sorted()的类型与从YAML加载的arr的类型不同( CommentedSeq),当然也没有与之相关的评论。

因此,您需要做的是保留评论信息, 适当类型排序的结果,然后分配保留的 该对象的信息。幸运的是,这只需要更改一次 并在代码中添加了一行:

import sys
import ruamel.yaml

people = """\
# manager of project
- title: manager

# owner of company
- title: owner
"""

yaml = ruamel.yaml.YAML()
arr = yaml.load(people)
root_comment = arr.ca
arr  = ruamel.yaml.comments.CommentedSeq(sorted(arr, key=lambda x: x['title']))
arr._yaml_comment = root_comment
yaml.dump(arr, sys.stdout)

给出:

# manager of project
- title: manager

# owner of company
- title: owner

但是,一般来说,这种广泛的操作将使您 陷入麻烦。尝试使用就地排序可能更好。

相关问题