如何使用ruamel.yaml添加评论

时间:2019-05-16 10:08:29

标签: python yaml comments ruamel.yaml

我正在尝试使用ruamel.yaml创建数据结构,并想在之前添加评论,然后再次转储和/或加载它。 不幸的是,所有示例都首先使用往返转储程序加载了一些字符串,或者不再使用不再存在的API。

这就是我要转储的内容:

test: asdf # Test Comment!

我尝试了以下操作:

insert = ruamel.yaml.comments.CommentedMap()
start_mark = ruamel.yaml.error.CommentMark(0)
insert['test'] = 'asdf'
insert.ca.items['test'] = [ None,
    [ruamel.yaml.CommentToken(value='# Test Comment!', start_mark=start_mark, end_mark=None)],
    None,
    None
]
ruamel.yaml.round_trip_dump(insert, sys.stdout)

打印。

# Test Comment!test: asdf

以某种方式,注释位于值的前面而不是后面。 我在做什么错了?

2 个答案:

答案 0 :(得分:2)

您可以尝试通过添加CommentTokens来做到这一点,但是 start_mark类型必须来自ruamel.yaml.error

insert设为CommentedMap(这就是更容易) 映射将在进行常规往返加载时加载), 然后使用其yaml_add_eol_comment方法:

import sys
import ruamel.yaml


insert = ruamel.yaml.comments.CommentedMap()
insert['test'] = 'asdf'
insert.yaml_add_eol_comment('Test Comment!', 'test', column=0)

yaml = ruamel.yaml.YAML()
# yaml.indent(mapping=4, sequence=4, offset=2)
yaml.dump(insert, sys.stdout)

给出:

test: asdf # Test Comment!

column=0是可选的。如果您未指定开始列, 您将在#之前得到两个空格,0试图将其一直推到最前面,但是键-值对当然在后面。

您可以在 您为#方法指定的EOL注释,但是如果 它不在那里,将被添加。

如果您在多个按键之后有多个评论, 行,并希望您的注释对齐,您只需指定 添加的第一个列。

答案 1 :(得分:1)

参考最新文档,https://yaml.readthedocs.io/en/latest/example.html

CommentedMap,类似于dict,在双向加载时会得到,它支持将键插入特定位置,同时可以选择添加注释:

import sys
from ruamel.yaml import YAML

yaml_str = """\
key: value # first line and comment!
"""

yaml = YAML()
data = yaml.load(yaml_str)
data.insert(1, 'test', 'asdf', comment="Test Comment!")
yaml.dump(data, sys.stdout)

输出:

key: value # first line and comment!
test: asdf # Test Comment!