PyYAML转储格式

 一个幼儿女教师上 发布于 2023-02-07 19:28

我知道在SO上有一些关于这个的问题,但我找不到我想要的东西.

我正在使用pyyaml来读取(.load()).yml文件,修改或添加一个键,然后.dump()再次写入它.问题是我想在转储后保留文件格式,但它会改变.

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

蟒蛇:

with open(path, 'r', encoding = "utf-8") as yaml_file:
    self.dict = pyyaml.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 )

YAML:

之前:

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

后:

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

有没有办法保持相同的格式?,例如qoutes和order.我使用了错误的工具吗?

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

非常感谢你.

1 个回答
  • ruamel.yaml改用.

    图书馆战斗!两个图书馆的故事

    PyYAML 实际上已经死了,已经有好几年了.更复杂的是,http://pyyaml.org上的官方项目似乎最近被取消了.该网站托管了PyYAML问题跟踪器,文档和下载.在撰写本文时,一切都已消失.这简直就是灾难性的.欢迎来到开源的另一天.

    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巧妙地尊重所有输入格式.一切.整个风格的辣酱玉米饼馅.整个文学shebang.所有.

    图书馆迁移:代码之泪的踪迹

    由于ruamel.yaml是PyYAML分支,因此符合PyYAML API,从PyYAML切换到ruamel.yaml现有应用程序通常就像替换所有实例一样简单:

    # This imports PyYAML. Stop doing this.
    import yaml
    

    ...有了这个:

    # This imports "ruamel.yaml". Always do this.
    from ruamel import yaml
    

    而已.

    不需要进行其他更改.这些yaml.load()yaml.dump()函数应该继续按预期运行 - 现在支持YAML 1.2并积极接收错误修复的额外好处.

    往返保护及其能为您做些什么

    为了与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='')
    

    它完成了.现在将完整保留注释,排序,引用和空白.

    TL;博士

    一直用ruamel.yaml.永远不要使用PyYAML.ruamel.yaml住.PyYAML是一个腐烂的尸体,在PyPi的砾石地面腐烂.

    万岁ruamel.yaml.

    2023-02-07 19:31 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有