[英]Python ruamel.yaml - preserving quote in value while convert yaml to dict and save result to yaml file
[英]remove single quotes from dict values while adding content to yaml file using python ruamel.yaml
我有一个 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
是一个字符串。 转储时字符串通常不会被引用,但如果它们的解释不明确,它们就会被引用。 这就是为什么您的输出周围有单引号的原因:确保在此节点中读回时不会被错误地解释为 mapping 而不是 string 。 因此,使用.strip()
删除不存在的引号不会执行任何操作。
你应该从你想要完成的事情向后工作(你实际上想要一个映射而不是一个字符串,正如你可以从输出中看到的那样)。
如果加载所需的输出,您将看到test1_routable_net
的值是 python dict(或其子类),因此请确保这是您分配给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
得到你想要的输出。 您还可以查看将ruamel.comments.CommentedMap
分配给test
,这使您可以更精细地控制其样式(和评论等)。
"test" 不是一个字符串,它是一个字典:例如:
import ruamel.yaml
import 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,open('test2.yaml', 'w'))
我有一个如下面提到的 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('\\'')
,但仍然没有用,我看到值的单引号....如何从值中删除这些引号?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.