我有一个 yaml 文件,如下所述
test1.yaml
resources:
name:{get_param: vname}
ssh_keypair: {get_param: ssh_keypair}
现在我想在 test1.yaml 的资源下添加 test1_routable_net: { get_param: abc_routable_net }
这是我尝试过的代码
import ruamel.yaml
yaml = ruamel.yaml.YAML()
test="{ get_param: abc_routable_net }".strip(‘\’’)
with open('/tmp/test1.yaml') as fp:
data = yaml.load(fp)
data['resources'].update({‘test1_routable_net’:test})
yaml.dump(data,file('/tes2.yaml', 'w'))
上述代码的输出是
tes2.yaml
resources:
name:{get_param: vname}
ssh_keypair: {get_param: ssh_keypair}
test1_routable_net: '{ get_param: abc_routable_net }'
期望的输出是
tes2.yaml
resources:
name:{get_param: vname}
ssh_keypair: {get_param: ssh_keypair}
test1_routable_net: { get_param: abc_routable_net }
我尝试使用test.strip('\'')
,但仍然没有用,我看到该值的单引号....如何从值中删除这些引号?
在你的程序中test
是一个字符串。字符串在转储时通常不会被引用,但如果它们的解释不明确,它们就会被引用。这就是为什么你的输出带有单引号的原因:确保读回该节点时不会被错误地解释为映射而不是字符串。
删除不存在的引号.strip()
因此不做任何事情。
您应该从您想要完成的事情开始向后工作(您实际上需要一个映射而不是字符串,正如从输出中可以看到的那样)。
如果加载所需的输出,您将看到test1_routable_net
是一个 python 字典(或其子类),所以请确保这是你分配给的test
:
import sys
import ruamel.yaml
yaml = ruamel.yaml.YAML()
test = { 'get_param': 'abc_routable_net' }
with open('./test1.yaml') as fp:
data = yaml.load(fp)
data['resources'].update({'test1_routable_net': test})
yaml.dump(data, sys.stdout)
这使:
resources:
name:{get_param: vname}
ssh_keypair: {get_param: ssh_keypair}
test1_routable_net:
get_param: abc_routable_net
这在语义上与您想要的输出相同,但是因为您想要get_param: abc_routable_net
在流程式中,您可以添加:
yaml.default_flow_style=None
以获得您想要的输出。您还可以查看分配给test
, a ruamel.comments.CommentedMap
,这使您可以对其样式(和注释等)进行更细粒度的控制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)