列为YAML中的值

如何解决列为YAML中的值

我有一个YAML模板,可以通过用户输入来填写。重点是“硬件”,因为值可以是[abc,def]abc[abc,def,ghi]

输入为'abc'时。在YAML中,它显示abc。但是,当值为'[abc,def]'时,它会显示'[abc,def]',并带有引号。我正在寻找一种不包含 quotes 方法

TEMPLATE = """
router:
  arrangements:
  - range:
      start: INPUT
      stop: INPUT
    hardware: INPUT
  - range:
      start: INPUT
      stop: INPUT
    hardware: INPUT
"""

yaml = YAML()
config = yaml.load(TEMPLATE)
config['router']['arrangements'][1]['hardware'] = '[def,ghi]'

data_format = ruamel.yaml.comments.CommentedMap(config)

with open('test.yaml','w') as _f:
    ruamel.yaml.dump(
        data_format,stream=_f,Dumper=ruamel.yaml.roundtripDumper,explicit_start=False,width=1024
    )

预期输出

hardware: [def,ghi]

当前输出

hardware: '[def,ghi]'

解决方法

如果使用往返转储程序,默认情况下ruamel.yaml以块样式转储所有添加的字典/列表。 如果要以流样式创建序列,则必须执行库采取的额外步骤 当往返流样式元素时:

import sys
import ruamel.yaml

TEMPLATE = """
router:
  arrangements:
  - range:
      start: INPUT
      stop: INPUT
    hardware: INPUT
  - range:
      start: INPUT
      stop: INPUT
    hardware: INPUT
"""

def flow_seq(l):
    ret_val = ruamel.yaml.comments.CommentedSeq(l)
    ret_val.fa.set_flow_style()
    return ret_val

yaml = ruamel.yaml.YAML()
yaml.explicit_start = False
yaml.width = 1024

config = yaml.load(TEMPLATE)
config['router']['arrangements'][1]['hardware'] = flow_seq(['def','ghi'])

assert isinstance(config,ruamel.yaml.comments.CommentedMap)

yaml.dump(config,sys.stdout)

给出:

router:
  arrangements:
  - range:
      start: INPUT
      stop: INPUT
    hardware: INPUT
  - range:
      start: INPUT
      stop: INPUT
    hardware: [def,ghi]

无需像以前一样使用旧样式ruamel.yaml.dump()进行输出。您可以控制YAML()实例 您可以通过设置属性来输入输出。

我还建议通过流式传输到stdout进行测试,这比查看文件内容要容易得多。 一旦一切正常,您可以将最后一行替换为:

 from pathlib import Path
 out_file = Path('test.yaml')

 yaml.dump(config,out_file)

如果用户输入使用方括号定界字符串'[def,ghi]',则可以使用类似的方式将其转换

s = '[def,ghi]'  # replace by the user input
l = [x.strip() for x in s.lstrip('[').rstrip(']').split(',')]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?