【发布时间】:2020-05-24 17:31:52
【问题描述】:
我正在尝试从 YAML 文件中加载一些数据并将其放回:
services:
dc01:
sw-06-50001:
servers:
- {ip: 10.255.206.12, port: 50001, weight: 100}
- {ip: 10.255.206.13, port: 50001, weight: 90}
virtual: {ip: 192.168.1.4, port: 50001}
sw-09-50002:
servers:
- {ip: 10.255.206.18, port: 50002, weight: 100}
- {ip: 10.255.206.19, port: 50002, weight: 90}
virtual: {ip: 192.168.1.4, port: 50002}
sw-06-50003:
servers:
- {ip: 10.255.206.12, port: 50003, weight: 100}
- {ip: 10.255.206.13, port: 50003, weight: 90}
virtual: {ip: 192.168.1.4, port: 50003}
sw-09-50004:
servers:
- {ip: 10.255.206.18, port: 50004, weight: 100}
- {ip: 10.255.206.19, port: 50004, weight: 90}
virtual: {ip: 192.168.1.4, port: 50004}
用这个:
import ruamel.yaml as yaml
with open('filename.yml', 'r') as stream:
outdata = yaml.load(stream,Loader=yaml.Loader)
yaml.dump(outdata,'filename_out.yml')
我需要保留列表中的所有格式和数据顺序,但输出转储会导致按 sw-xx.. 键按字母顺序排序:
services:
dc01:
sw-06-50001:
servers:
- {ip: 10.255.206.12, port: 50001, weight: 100}
- {ip: 10.255.206.13, port: 50001, weight: 90}
virtual: {ip: 192.168.1.4, port: 50001}
sw-06-50003:
servers:
- {ip: 10.255.206.12, port: 50003, weight: 100}
- {ip: 10.255.206.13, port: 50003, weight: 90}
virtual: {ip: 192.168.1.4, port: 50003}
sw-09-50002:
servers:
- {ip: 10.255.206.18, port: 50002, weight: 100}
- {ip: 10.255.206.19, port: 50002, weight: 90}
virtual: {ip: 192.168.1.4, port: 50002}
sw-09-50004:
servers:
- {ip: 10.255.206.18, port: 50004, weight: 100}
- {ip: 10.255.206.19, port: 50004, weight: 90}
virtual: {ip: 192.168.1.4, port: 50004}
转储时如何保持条目的原始顺序?
【问题讨论】:
-
你不能,因为那不是一个列表。
-
在模块 ruamel.yaml 中使用了自定义的 ordereddict(),而不是 dict(),因此在这里使用字典不是问题。正如@Anthon 所说,问题在于使用过时的库兼容性而不是正常使用。