我需要对带有评论的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
在排序时,第一个元素的注释消失了。我如何保留列表的第一条评论?
答案 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
但是,一般来说,这种广泛的操作将使您 陷入麻烦。尝试使用就地排序可能更好。