如何在 Python 中使用 ruamel.yaml 从 YAML 文件中获取注释?

Posted

技术标签:

【中文标题】如何在 Python 中使用 ruamel.yaml 从 YAML 文件中获取注释?【英文标题】:How can I get comments from a YAML file using ruamel.yaml in Python? 【发布时间】:2016-11-10 04:29:54 【问题描述】:

我想从使用ruamel.yaml 加载的 YAML 文件中获取注释字符串。 project documentation 缺少 API 参考,我找不到相关示例。访问 cmets 的正确方法是什么?

import ruamel.yaml

yaml = """\
%YAML 1.2
---
# C1
a: # C2
  # C3
  # C4
  b: 1 # C5
  c: # A comment here will not be parsed properly by ruamel.yaml v0.11.14
  - abc # C6
  - xyz # C7
  # C8
# C9
"""

loaded = ruamel.yaml.round_trip_load(yaml)

# Now what?

【问题讨论】:

确实仍然不可能对只有一个键的行进行评论并正确保留它。这是没有 API 的原因之一,因为 ruamel.yaml 应该更完整(包括支持底层数据结构应该更改的这些罕见情况)。评论存储也需要有意义的属性名称而不是列表索引(以某种打乱的顺序)。 ruamel.yaml 应该摆脱更多 PyYAML 遗留问题,并且在使用基于 C 的解析器阶段时,注释往返也应该起作用。 当然还有一个问题,就是判断自己一行的注释是属于前一个标量,还是属于下一个标量等等。 【参考方案1】:

图书馆作者在an issue on BitBucket(2016 年 5 月 9 日)中对此进行了讨论:

评论保存未稳定,例如如果映射的键和值不在同一行并且键(或键和值)有注释,我需要做一些事情。我最初的目标是保存现有的 cmets,而不是太多的操作。

通过一些实验,我确定了上述问题中提供的示例代码的以下工作:

print('Comment 1: ' + loaded.ca.comment[1][0].value)
print('Comment 2: ' + loaded.ca.items['a'][2].value)
print('Comment 3: ' + loaded.ca.items['a'][3][0].value)
print('Comment 4: ' + loaded.ca.items['a'][3][1].value)
print('Comment 5: ' + loaded['a'].ca.items['b'][2].value)
print('Comment 6: ' + loaded['a']['c'].ca.items[0][0].value)
print('Comment 7: ' + loaded['a']['c'].ca.items[1][0].value)
print('Comment 8: ' + loaded['a']['c'].ca.end[0].value)
print('Comment 9: ' + loaded['a']['c'].ca.end[1].value)

【讨论】:

是的,一般来说,如果你有一个映射/字典对象,你可以为特定元素使用ca.items[key] to get the comments associated with the key, and similarly for sequences/list you use ca.items[index]`。 _test/test_comment_manipulation.py 中的操作可以进一步提供一些关于如何设置新 cmets 的线索。

以上是关于如何在 Python 中使用 ruamel.yaml 从 YAML 文件中获取注释?的主要内容,如果未能解决你的问题,请参考以下文章

我如何在 Python 中使用 GCP 枚举?

如何在python中使用nice命令?

如何在 Python 中使用 Selenium?

如何在Python中使用textcat?

当python使用“Python.h”调用该c++进程时,如何在python中停止一个c++进程

如何使用 Boost.Python 在 Python 中调用内置函数