首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ruamel.yaml如何在CommentedMap中对元素进行排序

ruamel.yaml如何在CommentedMap中对元素进行排序
EN

Stack Overflow用户
提问于 2021-08-24 10:47:18
回答 1查看 47关注 0票数 0

我希望加载YAML文件,按键对其进行排序并转储该文件。

我已经尝试了this answer中给出的解决方案,但它不起作用。

我的YAML文件:

代码语言:javascript
运行
复制
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。

代码语言:javascript
运行
复制
# 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)

下面的代码片段适用于排序

代码语言:javascript
运行
复制
    yml = YamlUtil().load_file(args.input)
    yml['devices'].sort(lambda x: x['hostName'])
    YamlUtil().dump_file(yml, args.output)

但是我如何让它成为泛型排序呢?

EN

回答 1

Stack Overflow用户

发布于 2021-08-24 15:52:34

您没有指出什么不起作用,但您可能没有使用Python2.7,链接答案期望Python2.7加载ruamel.ordereddict,并为ruamel.yaml.comments.CommentedMap提供.sort()方法。

当使用较新的python版本时,只需删除对CommentedMap的特殊处理

代码语言:javascript
运行
复制
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)

这就给出了:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68906160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档