我希望加载YAML文件,按键对其进行排序并转储该文件。
我已经尝试了this answer中给出的解决方案,但它不起作用。
我的YAML文件:
devices:
#list of devices #list of devices
- hostName: testhb200
hostNetwork: 192.178.101.0
hostMask: 255.255.255.255
- hostName: testha100
hostNetwork: 192.178.225.12
hostMask: 255.255.255.252
hostGateway: 192.178.225.13
hostIp: 192.168.225.14
vendor: vendor
model: qfx5200-
我正在使用下面的代码片段来加载YAML。
# YAML settings
class YamlUtil:
logging.basicConfig(level=os.environ.get("LOGLEVEL", "INFO"))
# YAML settings
_yaml = YAML(typ="rt")
_yaml.default_flow_style = False
_yaml.explicit_start = False
_yaml.preserve_quotes = True
_yaml.indent(mapping=2, sequence=4, offset=2)
_yaml.Representer.add_representer(OrderedDict,
_yaml.Representer.represent_dict)
def __init__(self, yaml: YAML = _yaml):
# Override default class yaml settings
self.yaml = yaml
def load_file(self, file):
with open(file, "r") as f:
return self.yaml.load(f)
def dump_file(self, data, file):
with open(file, "w") as f:
self.yaml.dump(data, f)
下面的代码片段适用于排序
yml = YamlUtil().load_file(args.input)
yml['devices'].sort(lambda x: x['hostName'])
YamlUtil().dump_file(yml, args.output)
但是我如何让它成为泛型排序呢?
发布于 2021-08-24 15:52:34
您没有指出什么不起作用,但您可能没有使用Python2.7,链接答案期望Python2.7加载ruamel.ordereddict
,并为ruamel.yaml.comments.CommentedMap
提供.sort()
方法。
当使用较新的python版本时,只需删除对CommentedMap
的特殊处理
import sys
import pathlib
from collections import OrderedDict
import ruamel.yaml
YAML = ruamel.yaml.YAML
CM = ruamel.yaml.CommentedMap
# YAML settings
class YamlUtil:
# logging.basicConfig(level=os.environ.get("LOGLEVEL", "INFO"))
# YAML settings
_yaml = YAML(typ="rt")
_yaml.default_flow_style = False
_yaml.explicit_start = False
_yaml.preserve_quotes = True
_yaml.indent(mapping=2, sequence=4, offset=2)
_yaml.Representer.add_representer(OrderedDict, _yaml.Representer.represent_dict)
def __init__(self, yaml: YAML = _yaml):
# Override default class yaml settings
self.yaml = yaml
def load_file(self, path):
return self.yaml.load(path)
def dump_file(self, data, path):
self.yaml.dump(data, path)
def rec_sort(d):
if isinstance(d, dict):
res = ruamel.yaml.CommentedMap()
for k in sorted(d.keys()):
res[k] = rec_sort(d[k])
return res
if isinstance(d, list):
for idx, elem in enumerate(d):
d[idx] = rec_sort(elem)
return d
data = YamlUtil().load_file(pathlib.Path('input.yaml'))
data = rec_sort(data)
YamlUtil().dump_file(data, sys.stdout)
这就给出了:
devices:
#list of devices #list of devices
- hostMask: 255.255.255.255
hostName: testhb200
hostNetwork: 192.178.101.0
- hostGateway: 192.178.225.13
hostIp: 192.168.225.14
hostMask: 255.255.255.252
hostName: testha100
hostNetwork: 192.178.225.12
model: qfx5200-
vendor: vendor
https://stackoverflow.com/questions/68906160
复制相似问题