【问题标题】:How do I add a new field to a YAML file in python?如何在 python 中向 YAML 文件添加新字段?
【发布时间】:2018-09-20 19:35:09
【问题描述】:

我有一个包含以下内容的 YAML 文件:

---
  'Croatia':
    population: 4600000
    capital: Zagreb
  'Italy':
    population: 60000000
    capital: Rome

如何添加新字段:

---
  'Croatia':
    population: 4600000
    capital: Zagreb
    continent: Europe
  'Italy':
    population: 60000000
    capital: Rome
    continent: Europe

如何将值为欧洲的“大陆”字段添加到每个州?

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 您的第二个示例在 'Croatia' 后遗漏了一个冒号,使其 YAML 无效。 YAML 规范中也没有提到字段。映射具有键和值。

标签: python parsing yaml field pyyaml


【解决方案1】:

如果你想保留你原来的 YAML 布局和引用,那么你通常不能用 pyyaml 做到这一点,而不需要付出很多努力。

使用ruamel.yaml(免责声明:我是该软件包的作者)这要简单得多,但是您仍然需要为顶层缩进做两个空格(使用transform 参数):

import sys
import ruamel.yaml

yaml_str = """\
---
  'Croatia':
    population: 4600000
    capital: Zagreb
"""

def indent_data(s):
    return s.replace('\n', '\n  ')

yaml = ruamel.yaml.YAML()
# yaml.indent(mapping=4, sequence=4, offset=2)
yaml.preserve_quotes = True
yaml.explicit_start = True
data = yaml.load(yaml_str)
data['Croatia']['continent'] = 'Europe'
yaml.dump(data, sys.stdout, transform=indent_data)

给予:

---
  'Croatia':
    population: 4600000
    capital: Zagreb
    continent: Europe

原始文档中的任何 cmets 都将保留在输出中,但 EOL cmets 可能会因为额外的缩进而移动。

【讨论】:

  • @Becks 是的,你可以,将open(your_file_name.yaml) 的结果而不是yaml_str 传递给yaml.load()。使用yaml_str 只是为了获得一个可测试的单源示例。
【解决方案2】:

加载它,像往常一样在字典中更新字段并再次转储。

data = yaml.load(...)
data['Croatia']['continent'] = 'Europe'
yaml.dump(data, ...)

【讨论】:

  • 绝对没有理由使用不安全的load() 代替safe_load()。您还应该指出,这样做会删除 'Croatia' 周围的(多余的)引号,没有 OP 要求的缩进,也没有文档标记的开头。
猜你喜欢
  • 2015-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 2021-11-11
  • 2017-04-21
  • 1970-01-01
相关资源
最近更新 更多