以更简洁的方式转储OrderedDict

时间:2018-08-21 10:32:36

标签: python yaml ruamel.yaml ordereddict

我的文件中有一个YAML文档,我需要对其进行一些结构化的更新 我从图书馆获得的信息。从此信息中转储密钥的顺序很重要。

YAML文件(input.yaml)如下:

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

(请不要问为什么链中的下一个程序仅支持YAML 1.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标签且没有  键值作为列表中的单个元素?

  • 我正在使用ruamel.yaml保留现有评论。
  • 我从图书馆获得了这种结构,但我无法指定应使用的结构 ruamel.yaml的!!omap
  • 我知道如何递归地走过去 结构,然后附加并转换CommentedMap ruamel.yaml的OrderedDict,但这很慢。

1 个答案:

答案 0 :(得分:1)

您可以查找如何将CommentedMap注册到CommentedMap 并为您的RoundTripRepresenter使用相同的代码。实际上,您只需要多一行:

OrderedDict

通过该程序,您可以:

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

您还可以使用PyYAML将表示符附加到聚合Dumper结构的方式:

%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

但这比较冗长。