我试图使用ruamel.yaml解析yaml文件的注释。问题是,我想以某种特定的方式(我认为这是逻辑的)来解析注释。我有以下yaml文件:
---
# comment for the foo variable
foo: 'foo_val'
# comment for the bar variable
bar: ['item1', 'item2']我一直想做的是:
from ruamel.yaml import YAML
yaml = YAML()
yaml.preserve_quotes = True
yaml.explicit_start = True
stream = open('my_file.yml', 'r')
loaded = yaml.load(stream) # by default is roundtrip
loaded.ca
print(loaded)打印以下内容:
Comment(
start=[None, [CommentToken('# comment for the foo variable\n', line: 1, col: 0)]],
items={
foo: [None, None, CommentToken('\n\n# comment for the bar variable\n', line: 3, col: 0), None]})
ordereddict([('foo', 'foo_val'), ('bar', ['item1', 'item2'])])正如您所看到的,注释的地图(我相信它的名称是这样的)没有保持顺序。我尝试了另一种方法,在变量定义下面进行注释,但是对于Python样式的列表,它也不起作用。
有没有人知道是否有可能得到注释的映射,而不把第一个注释看作是start对象?基本上,我的预期输出将是每个变量,注释就在顶部,即:
Comment(
items={
foo: [None, None, CommentToken('\n\n# comment for the foo variable\n', line: 0, col: 0), None],
bar: [None, None, CommentToken('\n\n# comment for the bar variable\n', line: 3, col: 0), None],
})编辑
理想情况下,我需要保持我所提供的示例中的格式,或者直接从一种格式转换到另一种格式。
发布于 2021-11-12 09:37:35
YAML规范要求丢弃注释。因此,它们的指定方式不能使您严格控制与其关联的节点。
ruamel尽力将注释映射到它认为它们属于的位置,以便可以复制初始输入,但是它通常不能在保留YAML语法的同时给出您所要求的控制。
一个可能的解决方案是使用显式键语法,以便您可以在键后面编写注释,这将创建一个明确的关联:
? foo # comment for the foo variable
: 'foo_val'
? bar # comment for the bar variable
: ['item1', 'item2']目前无法工作的原始提案,由Anthon:确认
一个可能的解决方案是使用流映射,它有一个显式的开始,因此注释肯定在映射中:
{
# comment for the foo variable
foo: 'foo_val',
# comment for the bar variable
bar: ['item1', 'item2']
}注意'foo_val'后面的逗号,这是流语法所必需的。缩进是可选的。
发布于 2021-11-12 10:15:39
ruamel.yaml中的注释原则上与正在处理的集合的键/索引节点相关联,因此解析器尚未看到的内容(如您想要的)几乎从未出现过。这方面有一些例外(文件中任何数据之前的注释,键和值之间的注释),但这是一般规则。空行和全行注释被视为行尾注释的延续(即使它们对于某个键/索引不存在)。
因此,尽管您的解释是有效的,但目前还没有一种容易的方法来获得您想要的评论。改进这方面的工作正在进行中(控制“后续”全行注释和emtpy行是如何关联的),但还没有估计什么时候会包括这些内容。
https://stackoverflow.com/questions/69940569
复制相似问题