我编写了一个简单的脚本,最后使用ruamel.yaml将其发布到YAML文件中(如下所示的示例)。我使用collections.OrderedDict
以便可以按字母顺序对键进行重新排序,但是即使在重新排序并使用json.load
/ json.dumps
将其转换回字典后,我也无法以有序方式将其打印出来。
我了解YAML规范并不关心顺序,但是我个人希望YAML文件排序,使用ruamel.yaml
模块执行此操作的正确方法是什么?
logging.to_syslog: 'false'
statsbeat:
multicast_interface_name: 'p1p1'
primary_field_name: 'primary'
udp_address: '239.253.0.50:20016'
all_documents_index: 'statsall-${statsbeat.exchange_code}-${statsbeat.name}'
exchange_code: 'd'
primary_field_algorithm: 'range'
cloud_type: 'none'
primary_field_algorithm_range: '1-48'
name: 'otpr'
logging.files:
permissions: '0644'
rotateeverybytes: 52428800
keepfiles: 7
name: '${statsbeat.name}.log'
参考方案
在ruamel.yaml
的默认往返模式下加载YAML文件时,
然后将序列加载到CommentedMap
(在ruamel.yaml.comments.py
)。那个CommentedMap
是的子类OrderedDict
(或Python2上的ruamel.ordereddict
)。
因此,您可以做的一件事是将OrderedDict
转换为CommentedMap
:
import sys
import ruamel.yaml
from ruamel.yaml.comments import CommentedMap
from collections import OrderedDict
data = OrderedDict([
('logging.to_syslog', 'false'),
('statsbeat', OrderedDict([
('multicast_interface_name', 'p1p1'),
('primary_field_name', 'primary'),
('udp_address', '239.253.0.50:20016'),
('all_documents_index', 'statsall-${statsbeat.exchange_code}-${statsbeat.name}'),
('exchange_code', 'd'),
('primary_field_algorithm', 'range'),
('cloud_type', 'none'),
('primary_field_algorithm_range', '1-48'),
('name', 'otpr'),
])),
('logging.files', OrderedDict([
('permissions', '0644'),
('rotateeverybytes', 52428800),
('keepfiles', 7),
('name', '${statsbeat.name}.log'),
])),
])
def comseq(d):
if isinstance(d, OrderedDict):
cs = CommentedMap()
for k, v in d.items():
cs[k] = comseq(v)
return cs
return d
data = comseq(data)
yaml = ruamel.yaml.YAML()
yaml.dump(data, sys.stdout)
这使:
logging.to_syslog: 'false'
statsbeat:
multicast_interface_name: p1p1
primary_field_name: primary
udp_address: 239.253.0.50:20016
all_documents_index: statsall-${statsbeat.exchange_code}-${statsbeat.name}
exchange_code: d
primary_field_algorithm: range
cloud_type: none
primary_field_algorithm_range: 1-48
name: otpr
logging.files:
permissions: '0644'
rotateeverybytes: 52428800
keepfiles: 7
name: ${statsbeat.name}.log
(如果您希望像示例中那样使用多余的单引号,则可以强制转换字符串
到SingleQuotedScalarString
(从ruamel.yaml.scalarstring
导入)。
但是可能更容易的是指示代表
表示OrderedDict
的方式与CommentedMap
相同。假设
与以前相同的data
导入和定义,您可以执行以下操作:
from ruamel.yaml.representer import RoundTripRepresenter
class MyRepresenter(RoundTripRepresenter):
pass
ruamel.yaml.add_representer(OrderedDict, MyRepresenter.represent_dict,
representer=MyRepresenter)
yaml = ruamel.yaml.YAML()
yaml.Representer = MyRepresenter
yaml.dump(data, sys.stdout)
结果与之前完全相同。
在返回'Response'(Python)中传递多个参数 - python我在Angular工作,正在使用Http请求和响应。是否可以在“响应”中发送多个参数。角度文件:this.http.get("api/agent/applicationaware").subscribe((data:any)... python文件:def get(request): ... return Response(seriali…
R'relaimpo'软件包的Python端口 - python我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。
Python ThreadPoolExecutor抑制异常 - pythonfrom concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED def div_zero(x): print('In div_zero') return x / 0 with ThreadPoolExecutor(max_workers=4) as execut…
如何用'-'解析字符串到节点js本地脚本? - python我正在使用本地节点js脚本来处理字符串。我陷入了将'-'字符串解析为本地节点js脚本的问题。render.js:#! /usr/bin/env -S node -r esm let argv = require('yargs') .usage('$0 [string]') .argv; console.log(argv…
TypeError:'str'对象不支持项目分配,带有json文件的python - python以下是我的代码import json with open('johns.json', 'r') as q: l = q.read() data = json.loads(l) data['john'] = '{}' data['john']['use…