代码之家  ›  专栏  ›  技术社区  ›  Anthon

以更简洁的方式转储ordereddict

  •  1
  • Anthon  · 技术社区  · 6 年前

    我在一个文件中有一个yaml文档,我需要用一些结构化的 我从图书馆得到的信息。从该信息中转储密钥的顺序很重要。

    YAML文件(YAML文件) input.yaml 看起来像:

    %YAML 1.1
    ---
    - element 1  # this is the first element
    - element 2
    

    (请不要问为什么链中的下一个程序只支持yaml1.1,尽管1.2已经 已外出九年以上)

    我的程序:

    import sys
    from collections import OrderedDict
    from pathlib import Path
    import ruamel.yaml
    
    path = Path('input.yaml')
    
    yaml = ruamel.yaml.YAML()  # defaults to round-trip
    yaml.version = (1, 1)
    yaml.explicit_start = True
    
    data = yaml.load(path)
    
    data.append(
        OrderedDict([
            ('hosts', 'all'), 
            ('vars', {'some_var': True}),
            ('tasks', [
                OrderedDict([('name', 'print some_var'), ('debug', {'var': 'some_var'})])
            ]),
        ]))
    
    
    yaml.dump(data, sys.stdout)
    

    输出:

    %YAML 1.1
    ---
    - element 1  # this is the first element
    - element 2
    - !!omap
      - hosts: all
      - vars:
          some_var: true
      - tasks:
        - !!omap
          - name: print some_var
          - debug:
              var: some_var
    

    如何输出 OrderedDict S没有得到 !!omap 标签和无标签 作为列表中单个元素的键值?

    • 我使用ruamel.yaml保留现有评论。
    • 我从图书馆得到这个结构,我 不能 指定它应该使用 拉梅尔 CommentedMap .
    • 我知道如何递归地遍历 结构,在附加和转换之前 有序字典 在里面 拉梅尔 编辑地图 但这是要慢一点。
    1 回复  |  直到 6 年前
        1
  •  1
  •   Anthon    6 年前

    您可以查找 CommentedMap 在注册 RoundTripRepresenter 使用相同的代码 OrderedDict 实际上,你只需要一条额外的线:

    yaml.Representer.add_representer(OrderedDict, yaml.Representer.represent_dict)
    

    有了它,你的程序就给了你:

    %YAML 1.1
    ---
    - element 1  # this is the first element
    - element 2
    - hosts: all
      vars:
        some_var: true
      tasks:
      - name: print some_var
        debug:
          var: some_var
    

    您还可以使用pyyaml将representer连接到聚合转储程序结构的方式:

    ruamel.yaml.add_representer(OrderedDict, ruamel.yaml.RoundTripDumper.represent_dict, Dumper=ruamel.yaml.RoundTripDumper)
    

    但这更为冗长。