如何解决列为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 举报,一经查实,本站将立刻删除。