将 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 文件中获得块式叶节点而不是流式叶节点。
我有以下代码:
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 文件中获得块式叶节点而不是流式叶节点。