ruamel.yaml 相当于 sort_keys?

Quu*_*one 5 python ruamel.yaml

我正在尝试使用ruamel.yaml. 我熟悉json模块的界面,在那里漂亮地打印一个 dict 就像

import json
with open('outfile.json', 'w') as f:
    json.dump(mydict, f, indent=4, sort_keys=True)
Run Code Online (Sandbox Code Playgroud)

有了ruamel.yaml,我已经到了

import ruamel.yaml
with open('outfile.yaml', 'w') as f:
    ruamel.yaml.round_trip_dump(mydict, f, indent=2)
Run Code Online (Sandbox Code Playgroud)

但它似乎不支持该sort_keys选项。似乎ruamel.yaml没有任何详尽的文档,并且在 Google 上搜索“ruamel.yaml sort”或“ruamel.yaml字母化”并没有达到我期望的简单程度。

是否有一个或两个班轮用于漂亮地打印带有排序键的 YAML 文件?

(请注意,我需要在整个容器中递归地将键按字母顺序排列;仅按字母顺序排列顶层是不够的。)


请注意,如果我使用round_trip_dump,则键不会排序;如果我使用safe_dump,则输出不是“YAML 风格”(或更重要的是“Kubernetes 风格”)YAML。我不想要[]{}在我的输出中。

$ pip freeze | grep yaml
ruamel.yaml==0.12.5

$ python
>>> import ruamel.yaml
>>> mydict = {'a':1, 'b':[2,3,4], 'c':{'a':1,'b':2}}
>>> print ruamel.yaml.round_trip_dump(mydict)  # right format, wrong sorting
a: 1
c:
  a: 1
  b: 2
b:
- 2
- 3
- 4

>>> print ruamel.yaml.safe_dump(mydict)  # wrong format, right sorting
a: 1
b: [2, 3, 4]
c: {a: 1, b: 2}
Run Code Online (Sandbox Code Playgroud)

Ant*_*hon 5

您需要一些处理映射/字典、序列/列表的递归函数:

import sys
import ruamel.yaml

CM = ruamel.yaml.comments.CommentedMap

yaml = ruamel.yaml.YAML()

data = dict(a=1, c=dict(b=2, a=1), b=[2, dict(e=6, d=5), 4])
yaml.dump(data, sys.stdout)

def rec_sort(d):
    try:
        if isinstance(d, CM):
            return d.sort()
    except AttributeError:
        pass
    if isinstance(d, dict):
        # could use dict in newer python versions
        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

print('---')

yaml.dump(rec_sort(data), sys.stdout)
Run Code Online (Sandbox Code Playgroud)

这使:

a: 1
c:
  b: 2
  a: 1
b:
- 2
- e: 6
  d: 5
- 4
---
a: 1
b:
- 2
- d: 5
  e: 6
- 4
c:
  a: 1
  b: 2
Run Code Online (Sandbox Code Playgroud)

注释映射是 ruamel.yaml 在执行往返(加载 + 转储)时使用的结构,往返旨在将键保持在加载期间的顺序。

当您data从带注释的 YAML 文件加载时,上面应该做一个合理的工作来保留对映射/序列的注释