首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用ruamel.yaml解析YAML注释

用ruamel.yaml解析YAML注释
EN

Stack Overflow用户
提问于 2021-11-12 09:24:19
回答 2查看 209关注 0票数 1

我试图使用ruamel.yaml解析yaml文件的注释。问题是,我想以某种特定的方式(我认为这是逻辑的)来解析注释。我有以下yaml文件:

代码语言:javascript
复制
---
# comment for the foo variable
foo: 'foo_val'

# comment for the bar variable
bar: ['item1', 'item2']

我一直想做的是:

代码语言:javascript
复制
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)

打印以下内容:

代码语言:javascript
复制
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对象?基本上,我的预期输出将是每个变量,注释就在顶部,即:

代码语言:javascript
复制
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],
  })

编辑

理想情况下,我需要保持我所提供的示例中的格式,或者直接从一种格式转换到另一种格式。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-12 09:37:35

YAML规范要求丢弃注释。因此,它们的指定方式不能使您严格控制与其关联的节点。

ruamel尽力将注释映射到它认为它们属于的位置,以便可以复制初始输入,但是它通常不能在保留YAML语法的同时给出您所要求的控制。

一个可能的解决方案是使用显式键语法,以便您可以在键后面编写注释,这将创建一个明确的关联:

代码语言:javascript
复制
? foo # comment for the foo variable
: 'foo_val'
? bar # comment for the bar variable
: ['item1', 'item2']

目前无法工作的原始提案,由Anthon:确认

一个可能的解决方案是使用流映射,它有一个显式的开始,因此注释肯定在映射中:

代码语言:javascript
复制
{
  # comment for the foo variable
  foo: 'foo_val',

  # comment for the bar variable
  bar: ['item1', 'item2']
}

注意'foo_val'后面的逗号,这是流语法所必需的。缩进是可选的。

票数 1
EN

Stack Overflow用户

发布于 2021-11-12 10:15:39

ruamel.yaml中的注释原则上与正在处理的集合的键/索引节点相关联,因此解析器尚未看到的内容(如您想要的)几乎从未出现过。这方面有一些例外(文件中任何数据之前的注释,键和值之间的注释),但这是一般规则。空行和全行注释被视为行尾注释的延续(即使它们对于某个键/索引不存在)。

因此,尽管您的解释是有效的,但目前还没有一种容易的方法来获得您想要的评论。改进这方面的工作正在进行中(控制“后续”全行注释和emtpy行是如何关联的),但还没有估计什么时候会包括这些内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69940569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档