使用 Python 更改 yaml 文件中的值

新手上路,请多包涵

我有一个 .yaml 文件,我想用 Python 代码更新。假设它看起来像这样:

   state: 'present'

我想要一个更改状态并保存文件的代码。我正在尝试这样的事情但失败了:

 def set_state(state):
    with open("file_to_edit.yaml", 'rw') as f:
        doc = yaml.load(f)
    doc['state'] = state
    yaml.dump(f)

我正在使用 Python 的“yaml”包。

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

阅读 1.3k
2 个回答

问题是 yaml.dump(doc) 实际上并没有写入文件。相反, 它将修改后的 YAML 作为字符串返回, 除非您也将文件描述符作为参数传递,这允许您直接写入文件。

以下应该工作:

 def set_state(state):
    with open('file_to_edit.yaml') as f:
        doc = yaml.load(f)

    doc['state'] = state

    with open('file_to_edit.yaml', 'w') as f:
        yaml.dump(doc, f)

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

最重要的是: 永远不要使用 yaml.load() 如果你不需要,因为原则上这样做是不安全的。对于这种简单的结构(没有标签),您应该使用 yaml.safe_load() (以及相应的 safe_dump() 如果您的数据在转储后无法安全加载,它将抱怨)。

yaml.dump() 具有以下签名:

 def dump(documents, stream=None, Dumper=Dumper,
         default_style=None, default_flow_style=None,
         canonical=None, indent=None, width=None,
         allow_unicode=None, line_break=None,
         encoding='utf-8', explicit_start=None, explicit_end=None,
         version=None, tags=None)

其中只有第一个需要给出,它应该是你的 doc 变量。如果您不指定流,则 dump() 将数据结构写入内存中的文件对象(如 StringIO),写入后将值作为字符串返回。

所以虽然你可以这样做:

 with open("file_to_edit.yaml", 'w') as f:
    f.write(yaml.safe_dump(doc))

这是低效的,并且对 yaml.safe_dump() 的工作原理知之甚少。

如果你想打开文件进行读写,你必须确保你重置了文件中的索引 截断了它的内容。这通常是不值得的,因此重新打开文件进行写入更安全:

 def set_state(state):
    file_name = "file_to_edit.yaml"
    with open(file_name) as f:
        doc = yaml.safe_load(f)
    doc['state'] = state
    with open(file_name, 'w') as f:
        yaml.safe_dump(doc, f, default_flow_style=False)

(当然,当您想确保覆盖原始文件时,您将文件名设为变量,这样您就不会输入错误)。

如果您不指定 default_flow_style=False ,您的输出将如下所示:

 {state: deleted}

输出将不包括输入中围绕 present 的多余引号。您也可以指定 default_style="'" ,但这也会在 state 周围加上引号。

如果丢失引号是个问题并且您确实希望输出看起来像输入,则应该使用 ruamel.yaml (免责声明我是该包的作者),它可以保留单个字符串上的引号,处理 YAML 1.2(而不是 YAML 1.1)并在您的文件中保留注释。

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

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