我知道在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文件).
非常感谢你.
请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='')
它完成了.现在将完整保留注释,排序,引用和空白.
一直用ruamel.yaml
.永远不要使用PyYAML.ruamel.yaml
住.PyYAML是一个腐烂的尸体,在PyPi的砾石地面腐烂.
万岁ruamel.yaml
.