以更简洁的方式转储 OrderedDict
Dump OrderedDict in a more concise way
我的文件中有一个 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
如何在不获取 !!omap
标签且不获取 OrderedDict
的情况下输出 OrderedDict
s
键值作为列表中的单个元素?
- 我正在使用 ruamel.yaml 来保留现有评论。
- 我从一个库中得到这个结构,我不能指定它应该使用
ruamel.yaml 的
CommentedMap
。
- 我知道如何递归遍历
结构,在追加和转换
OrderedDict
之前
ruamel.yaml的CommentedMap
,不过就是要慢。
您可以查看 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 将表示器附加到聚合 Dumper 结构的方式:
ruamel.yaml.add_representer(OrderedDict, ruamel.yaml.RoundTripDumper.represent_dict, Dumper=ruamel.yaml.RoundTripDumper)
但这更冗长。
我的文件中有一个 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
如何在不获取 !!omap
标签且不获取 OrderedDict
的情况下输出 OrderedDict
s
键值作为列表中的单个元素?
- 我正在使用 ruamel.yaml 来保留现有评论。
- 我从一个库中得到这个结构,我不能指定它应该使用
ruamel.yaml 的
CommentedMap
。 - 我知道如何递归遍历
结构,在追加和转换
OrderedDict
之前 ruamel.yaml的CommentedMap
,不过就是要慢。
您可以查看 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 将表示器附加到聚合 Dumper 结构的方式:
ruamel.yaml.add_representer(OrderedDict, ruamel.yaml.RoundTripDumper.represent_dict, Dumper=ruamel.yaml.RoundTripDumper)
但这更冗长。