python中不覆盖的情况向yaml添加新的键值?

python 脚本,它负责通过添加新记录来更新我的 yaml 文件:

data = yaml.load(file)
data['WIN']['Machine'] = dict(node_labels='+> tfs vs2022')
data['WIN']['Machine'] = dict(vs='vs2022')
yaml.dump(data, file)

运行上面的脚本时,我都会得到更新的 yaml 文件,如下所示:

WIN:
  Machine:
    vs: vs2022

想要的输出同时包含键:值对

为什么一行data['WIN'][nodeName] = dict(node_labels='+> tfs vs2022')被下一行覆盖?如何添加几个键:Machine部分的值?

这不是与 YAML 相关的问题,而是与 yaml 无关的 Python 代码中的概念问题。

通过将字典作为值分配给 key Machine,您可以设置该值。通过将另一个字典分配给该键,您可以完全覆盖该值,从而擦除之前的键值对。

如果您简化代码:

data = dict(Machine=None)
data['Machine'] = dict(node_labels='+> tfs vs2022')
print('data 1', data)
data['Machine'] = dict(vs='vs2022')
print('data 2', data)

正如您在第二次分配后看到的那样,密钥node_labels不再可用。

<span style="color:#212529"><span style="background-color:#ffffff"><span style="background-color:var(--highlight-bg)"><span style="color:var(--highlight-color)"><code>data 1 {'Machine': {'node_labels': '+> tfs vs2022'}}
data 2 {'Machine': {'vs': 'vs2022'}}</code></span></span></span></span>

有几种方法可以解决这个问题。您可以为第一个字典中的键分配一个值:

data = dict(Machine=None)
data['Machine'] = added_dict = dict(node_labels='+> tfs vs2022')
print('data 1', data)
added_dict['vs'] ='vs2022'
print('data 2', data)

现在你在第二个输出中有两个键:

data 1 {'Machine': {'node_labels': '+> tfs vs2022'}}
data 2 {'Machine': {'node_labels': '+> tfs vs2022', 'vs': 'vs2022'}}

如果您还不知道可以向其中添加键的字典,您可以使用.setdefault,使用键值分配和/或使用.update(对于一次更新多个键很有用):

data = dict()
data.setdefault('Machine', {})['node_labels'] = '+> tfs vs2022'
print('data 1', data)
data.setdefault('Machine', {}).update(dict(vs='vs2022'))
print('data 2', data)
data 1 {'Machine': {'node_labels': '+> tfs vs2022'}}
data 2 {'Machine': {'node_labels': '+> tfs vs2022', 'vs': 'vs2022'}}

当然,可以将node_labelsandvs放入一个字典中并分配,但这会覆盖从 YAML 加载的任何现有键值。所以使用.updateIMO 更好:

import sys
from pathlib import Path
import ruamel.yaml

file_in = Path('input.yaml')
# key in YAML mapping with null value
file_in.write_text("""
WIN:
""")
    
yaml = ruamel.yaml.YAML()
data = yaml.load(file_in)
if data['WIN'] is None:
    data['WIN'] = {}
data['WIN'].setdefault('Machine', {}).update(dict(node_labels='+> tfs vs2022'))
data['WIN'].setdefault('Machine', {}).update(dict(vs='vs2022'))
yaml.dump(data, sys.stdout)

这给出了预期结果:

WIN:
  Machine:
    node_labels: +> tfs vs2022
    vs: vs2022
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值