在使用python ruamel.yaml向yaml文件添加内容时,从dict值中删除单引号

在使用python ruamel.yaml向yaml文件添加内容时,从dict值中删除单引号,python,pyyaml,ruamel.yaml,Python,Pyyaml,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

我有一个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 }'
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 }'
resources:
  name:{get_param: vname}
  ssh_keypair: {get_param: ssh_keypair}
  test1_routable_net: { get_param: abc_routable_net }
我试着使用
test.strip('\'')
,但是没有用,我仍然看到值的单引号。。。。如何从值中删除这些引号?

“测试”不是字符串,而是dict: 例如:


在您的程序中,
test
是一个字符串。字符串通常在转储时不会被引用,但如果它们的解释不明确,则会被引用。这就是为什么您的输出周围有单引号的原因:以确保在该节点中读回时不会错误地解释为映射而不是字符串。 因此,使用
.strip()
删除不存在的引号没有任何作用

您应该从您想要完成的事情开始反向工作(您实际上想要的是一个映射,而不是一个字符串,从输出中可以看出)

如果加载所需的输出,您将看到
test1\u routable\u 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\u param:abc\u routable\u net
,因此可以添加:

yaml.default_flow_style=None

以获得所需的输出。您还可以考虑将
ruamel.comments.CommentedMap
分配给
test
,这样您就可以更细粒度地控制其样式(和注释等)。

也许这不是一个好答案,但几个小时后,我刚转到JSON

,您应该更新您的问题以表示实际的工作代码
ryaml
没有在任何地方定义,变量
test1\u routable\u net也没有定义。并使您的输入和输出文件有效YAML:不要使文件名成为YAML块的一部分,我已经在您的另一个问题中纠正了这一点。问问题时的马虎肯定是编程时马虎的标志。我会设法解决它。。。。可能我需要查看ruamel.yaml文件以了解更多详细信息。。。。。。。