首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在用Python进行YAML的双程倾倒过程中,是否有一种方法来维护秩序?

在用Python进行YAML的双程倾倒过程中,是否有一种方法来维护秩序?
EN

Stack Overflow用户
提问于 2020-05-24 17:31:52
回答 1查看 527关注 0票数 2

我试图从YAML文件中加载一些数据并将其放回原处:

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

在这方面:

代码语言:javascript
复制
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排序。钥匙:

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

我如何才能在倾销时保留原始的条目顺序?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-24 20:05:02

您正在进行往返,但您没有使用ruamel.yaml的往返功能。相反,您使用的是过时的PyYAML兼容性、loaddump函数。

相反,您应该实例化一个ruamel.yaml.YAML()实例,并使用该实例的loaddump方法,它们默认为双程,保留顺序(以及注释、标记名称等)。

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

这意味着:

代码语言:javascript
复制
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在一个文件中:

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

https://stackoverflow.com/questions/61989767

复制
相关文章

相似问题

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