1

我有一个 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('\''),但仍然没有用我看到值的单引号......如何从值中删除这些引号?

4

2 回答 2

2

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

你应该从你想要完成的事情开始向后工作(你实际上想要一个映射而不是一个字符串,正如从输出中可以看到的那样)。

如果您加载所需的输出,您将看到 for 的值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_netin flow 样式,您可以添加:

yaml.default_flow_style=None

得到你想要的输出。您还可以查看将testa 分配给 to ,ruamel.comments.CommentedMap这使您可以更细粒度地控制其样式(和注释等)。

于 2017-11-23T21:57:09.350 回答
0

“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'))
于 2017-11-22T19:44:12.577 回答