繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM