PyYAML 转储格式

新手上路,请多包涵

我知道 StackOverflow 上有一些关于此的问题,但我找不到我要找的东西。

我正在使用 pyyaml 读取( .load() )一个 .yml 文件,修改或添加一个密钥,然后写入它( .dump() )againec-0dacc4问题是我想保留转储后的文件格式,但它发生了变化。

例如,我编辑密钥 en.test.index.few"Bye" 而不是 "Hello"

Python:

 with open(path, "r", encoding = "utf-8") as yaml_file:
    self.dict = yaml.load(yaml_file)

然后,更改密钥后:

 with open(path, "w", encoding = "utf-8") as yaml_file:
    dump = pyyaml.dump(self.dict, default_flow_style = False, allow_unicode = True, encoding = None)
    yaml_file.write( dump )

亚姆:

前:

 en:
  test:
    new: "Bye"
    index:
      few: "Hello"
  anothertest: "Something"

后:

 en:
  anothertest: Something
  test:
    index:
      few: Hello
    new: Bye

有没有办法保持相同的格式?例如 qoutes 和订单。我为此使用了错误的工具吗?

我知道原始文件可能不完全正确,但我无法控制它(这是一个 Ruby-on-Rails i18n 文件)。

非常感谢。

原文由 nicosantangelo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 754
1 个回答

下面,改为使用 ruamel.yaml

ruamel.yaml 正在 积极维护。与 PyYAML 不同, ruamel.yaml 支持:

  • YAML <= 1.2。 PyYAML 仅支持 YAML <= 1.1。这是至关重要的,因为 YAML 1.2 在一些边缘情况下故意 破坏与 YAML 1.1 的向后兼容性。这通常是一件坏事。在这种情况下,这使 YAML 1.2 成为 JSON 的严格超集。由于 YAML 1.1 不是 JSON 的严格超集,这是一件好事。
  • 往返保存。 当调用 yaml.dump() 转储先前调用加载的字典时 yaml.load()
    • PyYAML 天真地忽略了所有输入格式——包括注释、排序、引用和空格。像很多数字垃圾一样被丢弃到最近的可用比特桶中。
    • ruamel.yaml 巧妙地尊重 所有 输入格式。一切。整个文体辣酱玉米饼馅。整个文学界。 全部。

库迁移

在现有应用程序中从 PyYAML 切换到 ruamel.yaml 通常只需将库导入更改为:

 from ruamel import yaml

这是有效的,因为 ruamel.yaml 是一个符合 PyYAML API 的 PyYAML 分支。

不需要其他更改。 yaml.load()yaml.dump() 函数应继续按预期运行。

往返保存及其能为您做什么

为了与 PyYaml 向后兼容, yaml.load()yaml.dump() 函数默认 执行往返保存。为此,显式传递:

  • 可选的 Loader=ruamel.yaml.RoundTripLoader 关键字参数 yaml.load()
  • 可选的 Dumper=ruamel.yaml.RoundTripDumper 关键字参数 yaml.dump()

一个示例来自 ruamel.yaml 文档

 import ruamel.yaml

inp = """\
# example
name:
  # Yet another Great Duke of Hell. He's not so bad, really.
  family: TheMighty
  given: Ashtaroth
"""

code = ruamel.yaml.load(inp, Loader=ruamel.yaml.RoundTripLoader)
code['name']['given'] = 'Astarte'  # Oh no you didn't.

print(ruamel.yaml.dump(code, Dumper=ruamel.yaml.RoundTripDumper), end='')

完成了。 注释、排序、引用和空格现在将被完整保留。

原文由 Cecil Curry 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏