【问题标题】:Editing YAML file by Python用 Python 编辑 YAML 文件
【发布时间】: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 输出不变。

【问题讨论】:

标签: python yaml edit


【解决方案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:stackoverflow.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

【讨论】:

    猜你喜欢
    • 2015-01-31
    • 2018-12-19
    • 2020-12-14
    • 2021-07-07
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多