【问题标题】:How do I edit a YAML file through python using ruamel.yaml and not pyyaml?如何使用 ruamel.yaml 而不是 pyyaml 通过 python 编辑 YAML 文件?
【发布时间】:2018-07-26 20:16:50
【问题描述】:

我在 StackOverflow 上发现了类似的问题,但是当我尝试实现代码 [Anthons's response] 以适应我的情况时,我注意到它实际上并没有编辑 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 不保留 cmets。

我运行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's response] 但我没有运气:

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

我收到以下错误:

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

【问题讨论】:

  • 您的代码(包括编写文件)对我有用。所以我猜这不是你真正的代码。
  • 你猜错了
  • 我可以重现您的错误:foo = None; foo["foo"] = 23。检查数据是否包含您认为的内容。正如我所说,您发布的代码对我有用
  • 好的,我会调查的。谢谢

标签: python yaml


【解决方案1】:

假设(未更改的)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

由于程序显示文件的内容,你可以确定它已经改变了

【讨论】:

    猜你喜欢
    • 2021-12-11
    • 2017-12-15
    • 2015-01-31
    • 2015-06-13
    • 2012-02-28
    • 2021-05-17
    • 2019-12-08
    • 2015-10-23
    相关资源
    最近更新 更多