在 Python 中更新 YAML 文件

Updating a YAML file in Python

我正在更新 Python3 中的以下 template.yaml 文件:

alpha:
  alpha_1: 
  alpha_2: 

beta:
  beta_1: 
  beta_2:
    -  beta_2a:
       beta_2b:

gamma: 

使用 ruamel.py 我可以正确地填空 space。

file_name = 'template.yaml'
config, ind, bsi = ruamel.yaml.util.load_yaml_guess_indent(open(file_name))

并更新我能够到达的每个元素:

alpha:
  alpha_1: "val_alpha1"
  alpha_2: "val_alpha2"

beta:
  beta_1: "val_beta1"
  beta_2: 
    -  beta_2a: "val_beta2a"
       beta_2b: "val_beta2b"

gamma: "val_gamma"

这里有一个问题,我可能需要 beta_2 节点中的其他子元素,这样:

alpha:
  alpha_1: "val_alpha1"
  alpha_2: "val_alpha2"

beta:
  beta_1: "val_beta1"
  beta_2: 
    -  beta_2a: "val_beta2a"
       beta_2b: "val_beta2b"

    -  beta_2c: "val_beta2c"
       beta_2d: "val_beta2d"

gamma: "val_gamma"

我事先不知道我是否需要像上面那样的更多分支并且每次都更改模板不是一个选项。 我对 update() 或附加字典的尝试没有成功。我怎样才能得到想要的结果?

我的尝试:

entry = config["beta"]["beta_2"]

entry[0]["beta_2a"] = "val_beta2a"
entry[0]["beta_2b"] = "val_beta2b"

entry[0].update = {"beta_2c": "val_beta2a", "beta_2d": "val_beta2d"}

在这种情况下,程序不会显示任何结果更改,这意味着最后一行更新根本不起作用。

2022-03-31 16:18:34 ['ryd', '--force', 'so-71693609.ryd']

列表的缩进量为 5,指标有两个 space 偏移量 (-), 所以没有真正需要尝试分析缩进,除非有其他程序 改变那个。

beta_2 的值是一个列表,要获得您需要的内容,您需要追加 该列表的字典:

import sys
from pathlib import Path
import ruamel.yaml
from ruamel.yaml.scalarstring import DoubleQuotedScalarString as DQ

file_name = Path('template.yaml')

   
yaml = ruamel.yaml.YAML()
yaml.indent(sequence=5, offset=2)
config = yaml.load(file_name)

config['alpha'].update(dict(alpha_1=DQ('val_alpha1'), alpha_2=DQ('val_alpha2')))
config['beta'].update(dict(beta_1=DQ('val_beta1')))
config['gamma'] = DQ('val_gamma')
entry = config["beta"]["beta_2"]

entry[0]["beta_2a"] = DQ("val_beta2a")
entry[0]["beta_2b"] = DQ("val_beta2b")

entry.append(dict(beta_2c=DQ("val_beta2a"), beta_2d=DQ("val_beta2d")))

yaml.dump(config, sys.stdout)

给出:

alpha:
  alpha_1: "val_alpha1"
  alpha_2: "val_alpha2"
beta:
  beta_1: "val_beta1"
  beta_2:
    -  beta_2a: "val_beta2a"
       beta_2b: "val_beta2b"
    -  beta_2c: "val_beta2a"
       beta_2d: "val_beta2d"
gamma: "val_gamma"