我有一个 Python 程序,它正在解析许多 YAML 文件,其中一些包含注释、 anchor 、引用和合并键,当我将 YAML 文件加载到解析器中时,我希望保留这些文件。当我运行以下命令时,ruamel.yaml
似乎对这些内容进行了往返保存:
with open(yaml_file, "r") as f:
yaml = f.read()
parsed_yaml = ruamel.yaml.load(yaml, ruamel.yaml.RoundTripLoader)
print ruamel.yaml.dump(parsed_yaml,Dumper=ruamel.yaml.RoundTripDumper)
它会打印出原始文件 yaml_file
,包括注释和合并键。我想知道当 YAML 以 OrderedDict
形式解析时是否可以访问这些注释和其他键。我需要将这些 YAML 文件转换为中间类型,因此能够获取和设置注释、合并键、 anchor 和引用是一个高优先级。
最佳答案
是的,您可以访问注释等。您的映射(python dict
)将加载到 CommentedMap
的实例中,并且您的序列(python list
) 在 CommentedSeq
的实例中。这些是 ordereddict
和 CommentedBase
的子类。 list
和 CommentedBase
。
CommentedBase有几个附加注释、合并、 anchor 和流式信息的属性。它还具有多种设置/获取这些值的方法,这些方法依赖于某些 map /序列特定的辅助函数。
import sys
from ruamel.yaml import YAML
yaml_str = """\
a: 1 # comment 1
b: 2
c: 3
d: 4
e: 5
"""
yaml = YAML()
data = yaml.load(yaml_str)
data.yaml_add_eol_comment('comment 2', key='c')
data.yaml_add_eol_comment('# comment 3', key='e', column=8)
yaml.dump(data, sys.stdout)
会给你:
a: 1 # comment 1
b: 2
c: 3 # comment 2
d: 4
e: 5 # comment 3
请注意:
- 如果您未指定起始列,则采用下一条注释的列。
- 如果注释字符串尚未以该字符组合开头,则将插入前导
#
和空格。 - 标量和注释之间至少有一个空格。
该接口(interface)的文档记录不足,主要是因为库作者的懒惰。你最好看看tests for comments和 anchors得到一些例子。该界面还需要对属性内容级别进行一些更改,例如允许将 EOL 注释附加到键以及键+值组合。以下 YAML 不会按照您的预期/正确地进行往返:
abc: # this is the key
9989 # this is the value
因此,请务必包装您需要的功能,以便在 ruamel.yaml
中的接口(interface)以向后不兼容的方式发生更改时,您可以在一个点进行更改。
关于python - Ruamel.yaml:如何访问加载的 OrderedDict 中的合并键和注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36224176/