【问题标题】:Ruamel.yaml: How to access merge keys and comments in loaded OrderedDictRuamel.yaml:如何在加载的 OrderedDict 中访问合并键和注释
【发布时间】:2016-07-13 11:01:45
【问题描述】:

我有一个 Python 程序正在解析许多 YAML 文件,其中一些包含我希望在将 YAML 文件加载到解析器时保留的 cmets、锚点、引用和合并键。当我运行以下命令时,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,因为它包含 cmets 和合并键。我想知道在以OrderedDict 形式解析 YAML 时是否可以访问这些 cmets 和其他密钥。我需要将这些 YAML 文件转换为中间类型,因此能够同时 getset cmets、合并键、锚点和引用是一个高优先级。

【问题讨论】:

    标签: python yaml ruamel.yaml


    【解决方案1】:

    是的,您可以访问 cmets 等。您的映射 (python dict) 将加载到 CommentedMap 的实例中,而您的序列 (python list) 将加载到 CommentedSeq 的实例中。这些是ordereddictCommentedBase 的子类,分别是。 listCommentedBase

    CommentedBase 有几个属性,它们附加了 cmets、merge、anchor 和 flow-style 信息。它还有几个方法可以设置/获取这些值,这些值依赖于一些地图/序列特定的辅助函数。

    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
    

    请注意:

    • 如果您不指定起始列,则采用下一个先前注释的列。
    • 如果注释字符串尚未以该字符组合开头,则会插入前导 # 和空格。
    • 标量和注释之间至少有一个空格。

    接口文档不足,主要是因为库作者的懒惰。您最好查看tests for commentsanchors 以获取一些示例。该界面还需要在属性内容级别上进行一些更改,例如允许将 EOL cmets 附加到键以及键+值组合。以下 YAML 不会像您预期/正确地往返:

    abc:      # this is the key
        9989  # this is the value
    

    因此,请务必封装您需要的功能,以便在ruamel.yaml 中的接口以向后不兼容的方式更改时,您可以在其中进行更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-25
      • 2019-10-21
      • 2021-11-02
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      相关资源
      最近更新 更多