繁体   English   中英

如何使用ruamel.yaml而不是pyyaml通过python编辑YAML文件?

[英]How do I edit a YAML file through python using ruamel.yaml and not pyyaml?

我在StackOverflow上发现了类似的问题,但是当我尝试实现适合自己情况的代码[ Anthons的响应 ]时,我注意到它实际上并没有编辑YAML文件。 另外,我需要使用ruamel.yaml,而不是PyYAML。 我评论过的许多答案都使用PyYAML。

import sys
import ruamel.yaml  

yaml = ruamel.yaml.YAML()
# yaml.preserve_quotes = True

with open('elastic.yml') as fp:
    data = yaml.load(fp)

data['cluster.name'] = 'BLABLABLABLABLA'
data['node.name'] = 'HEHEHEHEHEHEHE'

yaml.dump(data, sys.stdout)

这段代码以正确的编辑输出文件,但是,当我实际进入文件( elastic.yml )时,原始文档没有更改。

这是我第一次使用ruamel.yaml,因此我宁愿坚持这样做,因为我注意到PyYAML不保留评论。

运行python代码后的YAML文件:

cluster.name: my-application

# Use a descriptive name for the node:
node.name: HappyNode    

运行python代码后,输出到控制台:

cluster.name: BLABLABLABLABLA

# Use a descriptive name for the node:
node.name: HEHEHEHEHEHEHE

我尝试将其添加到代码的底部以确保将其写入文件,如下所述:[ Matheus Portela的响应 ],但我没有运气:

with open('elastic.yml', 'w') as f:
        yaml.dump(data, f)

我收到以下错误:

data['cluster.name'] = 'BLABLABLABLABLA'
TypeError: 'NoneType' object does not support item assignment

假设(不变的) elastic.yml是您的输入,则可以运行:

import ruamel.yaml  

file_name = 'elastic.yml'
yaml = ruamel.yaml.YAML()

with open(file_name) as fp:
    data = yaml.load(fp)

data['cluster.name'] = 'BLABLABLABLABLA'
data['node.name'] = 'HEHEHEHEHEHEHE'

with open(file_name, 'w') as fp:
    yaml.dump(data, fp)

# display file
with open(file_name) as fp:
    print(fp.read(), end='')

得到以下输出:

cluster.name: BLABLABLABLABLA

# Use a descriptive name for the node:
node.name: HEHEHEHEHEHEHE

由于程序显示文件的内容,因此可以确定它已更改

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM