用 Python 编辑 YAML 文件

Posted

技术标签:

【中文标题】用 Python 编辑 YAML 文件【英文标题】:Editing YAML file by Python 【发布时间】:2015-06-13 15:47:36 【问题描述】:

我有一个如下所示的 YAML 文件:

# Sense 1
- name  : sense1
  type  : float
  value : 31

# sense 2
- name  : sense2
  type  : uint32_t
  value : 1488

# Sense 3
- name  : sense3
  type  : int32_t
  value : 0

- name  : sense4
  type  : int32_t
  value : 0
- name  : sense5
  type  : int32_t
  value : 0
- name  : sense6
  type  : int32_t
  value : 0

我想使用 Python 打开这个文件,更改一些值(见上文)并关闭文件。我该怎么做?

例如我想设置 sense2[value]=1234,保持 YAML 输出不变。

【问题讨论】:

检查 PyYAML:pyyaml.org/wiki/PyYAML 【参考方案1】:
import yaml

with open("data.yaml") as f:
     list_doc = yaml.safe_load(f)

for sense in list_doc:
    if sense["name"] == "sense2":
         sense["value"] = 1234

with open("data.yaml", "w") as f:
    yaml.dump(list_doc, f)

【讨论】:

谢谢 jwilner - 它实际上改变了 Yaml 的格式(不想要!)eg-got name: sense_base_temp, type: float, value: 31 - name: sense_common_delay, type: uint32_t,值:1488 - 名称:sense1,类型:int32_t,值:0 - 名称:sense2,类型:int32_t,值:0 - 名称:sense3,类型:int32_t,值:0 - 名称: sense4,类型:int32_t,值:0 啊,我得到了你想要的。我想你想用关键字参数default_flow_style=False调用yaml.dump 是的 - 现在好了!! - 但是原始 Yaml 中的所有 cmets 都消失了... (: 看起来您不能保留 cmets:***.com/questions/7255885/…。如果您的更改很简单,您可以将文件作为字符串读取并使用字符串操作。 从 5.1 版开始,您应该使用 yaml.load(<path>, Loader=yaml.FullLoader) 来避免警告。【参考方案2】:

如果您关心保留映射键的顺序、注释和根级序列元素之间的空格,例如因为这个文件在版本控制之下,那么你应该使用ruamel.yaml(免责声明:我是那个包的作者)。

假设您的 YAML 文档在文件 input.yaml 中:

import sys
import ruamel.yaml

yaml = ruamel.yaml.YAML()
# yaml.preserve_quotes = True
with open('input.yaml') as fp:
    data = yaml.load(fp)
for elem in data:
    if elem['name'] == 'sense2':
         elem['value'] = 1234
         break  # no need to iterate further
yaml.dump(data, sys.stdout)

给予:

# Sense 1
- name: sense1
  type: float
  value: 31

# sense 2
- name: sense2
  type: uint32_t
  value: 1234

# Sense 3
- name: sense3
  type: int32_t
  value: 0

- name: sense4
  type: int32_t
  value: 0
- name: sense5
  type: int32_t
  value: 0
- name: sense6
  type: int32_t
  value: 0

【讨论】:

以上是关于用 Python 编辑 YAML 文件的主要内容,如果未能解决你的问题,请参考以下文章

Yaml文件

python——Yaml

Python如何调用yaml文件中的参数来执行ssh命令

关于yaml文件的1234件事

python读取yaml配置文件

python之yaml文件读取