我试图从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}我如何才能在倾销时保留原始的条目顺序?
发布于 2020-05-24 20:05:02
您正在进行往返,但您没有使用ruamel.yaml的往返功能。相反,您使用的是过时的PyYAML兼容性、load和dump函数。
相反,您应该实例化一个ruamel.yaml.YAML()实例,并使用该实例的load和dump方法,它们默认为双程,保留顺序(以及注释、标记名称等)。
import sys
import ruamel.yaml
yaml_str = """\
services:
dc01:
sw-06-50001: # first
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: # third
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}
"""
yaml = ruamel.yaml.YAML()
# yaml.indent(mapping=4, sequence=4, offset=2)
# yaml.preserve_quotes = True
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)这意味着:
services:
dc01:
sw-06-50001: # first
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: # third
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}或者万一你的YAML在一个文件中:
from pathlib import Path
from ruamel.yaml import YAML
# the recommended extension for YAML files has been .yaml since 2006.
file_name = Path('filename.yaml')
file_out = Path('filename_out.yaml')
yaml = YAML()
outdata = yaml.load(file_name)
yaml.dump(outdata, file_out)https://stackoverflow.com/questions/61989767
复制相似问题