我的文件中有一个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
标签且没有
键值作为列表中的单个元素?
!!omap
。 CommentedMap
ruamel.yaml的OrderedDict
,但这很慢。答案 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
但这比较冗长。