如何使用 python 和 ruamel 更新这个 yaml 文件?

时间:2021-01-28 22:41:08

标签: python file yaml pyyaml ruamel.yaml

我有一个包含内容的 test.yaml 文件:

school_ids:
  school1: "001"

  #important school2
  school2: "002"


targets:
  neighborhood1:
    schools:
      - school1-paloalto
    teachers:
      - 33
  neighborhood2:
    schools:
      - school2-paloalto
    teachers:
      - 35

我想使用 ruamel 将文件更新为如下所示:

school_ids:
  school1: "001"

  #important school2
  school2: "002"

  school3: "003"


targets:
  neighborhood1:
    schools:
      - school1-paloalto
    teachers:
      - 33
  neighborhood2:
    schools:
      - school2-paloalto
    teachers:
      - 35
  neighborhood3:
    schools:
      - school3-paloalto
    teachers:
      - 31

如何使用 ruamel 更新文件以通过保留注释来获得所需的输出?

这是我目前所拥有的:

import sys
from ruamel.yaml import YAML

inp = open('/targets.yaml', 'r').read()

yaml = YAML()

code = yaml.load(inp)
account_ids = code['school_ids']
account_ids['new_school'] = "003"
#yaml.dump(account_ids, sys.stdout)


targets = code['targets']
new_target = dict(neighborhood3=dict(schools=["school3-paloalto"], teachers=["31"]))
yaml = YAML()
yaml.indent(mapping=2, sequence=3, offset=2)
yaml.dump(new_target, sys.stdout)

1 个答案:

答案 0 :(得分:1)

您只是在转储您从头开始创建的 \s,而不使用 \S 甚至 final Handler h= new Handler(); h.postDelayed(new Runnable(){ @Override public void run() { Toast.makeText(Ab.this, "finish 6 seconds", Toast.LENGTH_SHORT).show(); } },6000); 。 相反,您应该使用那个 new_target 您加载并扩展与其根级键关联的值,然后转储 code:

targets

给出:

code

请注意,您的序列缩进需要至少比您的缩进大 2 偏移量(2 个位置为 code + SPACE 留出空间)

输出在键 import sys from pathlib import Path from ruamel.yaml import YAML inp = Path('test.yaml') yaml = YAML() code = yaml.load(inp) school_ids = code['school_ids'] school_ids['school3'] = "003" targets = code['targets'] targets['neighborhood3'] = dict(schools=["school3-paloalto"], teachers=["31"]) yaml = YAML() yaml.indent(mapping=2, sequence=4, offset=2) yaml.dump(code, sys.stdout) 之后有空行,因为这就是 这些与解析期间相关联。这可以移动到新键,但是 这不是微不足道的。如果你需要这样做(这对语义并不重要 的 YAML 文档),然后看看我的答案 here