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)
您需要一些处理映射/字典、序列/列表的递归函数:
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 文件加载时,上面应该做一个合理的工作来保留对映射/序列的注释
| 归档时间: |
|
| 查看次数: |
2838 次 |
| 最近记录: |