将 dict 转储到现有的 yaml 文件中,仅在使用 ruamel.yaml 更新时将 dict 字符串表示形式写入文件

Dump dict into existing yaml file just writes dict string representation into the file on updating using ruamel.yaml

我有以下代码:

if os.path.exists(MyFile):
            path = Path(MyFile)
            yaml = YAML(typ='safe')
            settings = yaml.load(path)

            # update settings when file exists
            settings['a'] = myVar
            settings['b'] = otherVar
            settings['c'] = anotherOne
            yaml.dump(settings, Path(MyFile))

# myFile does not exist
else:
    settings = {'a': myvar, 'b': other, 'c': otheragain}
    yaml = YAML()
    yaml.dump(settings, Path(MyFile))

这在第一次调用时(因此当 MyFile 不存在时)按预期工作。 但是,当再次调用代码(更新现有密钥)并将其再次转储到同一文件时,cat MyFile 显示以下内容:

{'a': myvar, 'b': other, 'c': otheragain}

但我想要的只是像以前一样的正确 YAML 格式。

为什么会发生这种情况,我该如何解决?

所以 TL;DR:转储到不存在的文件中会像预期的那样工作,但是 "updating" 或第二次转储只是将 dict 字符串表示写入文件!

发生这种情况,因为您在 else 子句中使用了往返转储器(这是默认设置,相当于使用 YAML(typ='rt')),并且您使用了 safe 转储器在 if 部分(具有不同的默认值)。

您应该将第三行改为:

    yaml = YAML() 

然后您将在 YAML 文件中获得块式叶节点而不是流式叶节点。