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