You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何灵活向不同嵌套结构的YAML文件指定区块追加数据?

灵活修改不同结构YAML文件的特定区块

当然可以轻松给结构不同的YAML文件的特定位置追加数据!下面我会用Python的两个常用库来演示具体操作,覆盖你提到的两种追加场景:在同级键下新增内容、在指定层级追加数据。

方案一:用ruamel.yaml(推荐,保留原文件格式)

ruamel.yaml是专门为修改YAML文件设计的库,它能保留原文件的注释、换行、块级文本格式(比如你用的|标记的多行内容),非常适合需要维持原文件结构的场景。

步骤1:安装库

pip install ruamel.yaml

步骤2:示例1 - 在file1.yaml的name1/name2同级追加键值对

假设file1.yaml内容如下:

test3:
  service1:
    name1: |
      "somedata"
    name2: |
      "somedata"

我们要在service1下新增name3键,代码如下:

from ruamel.yaml import YAML

yaml = YAML()
yaml.preserve_quotes = True  # 保留原有的引号格式

# 读取文件
with open('file1.yaml', 'r') as f:
    data = yaml.load(f)

# 在service1层级下新增同级键值对
data['test3']['service1']['name3'] = """
"new added data"
"""

# 写回文件(完全保留原格式)
with open('file1.yaml', 'w') as f:
    yaml.dump(data, f)

执行后,file1.yaml会变成:

test3:
  service1:
    name1: |
      "somedata"
    name2: |
      "somedata"
    name3: |
      "new added data"

步骤3:示例2 - 在file2.yaml的指定层级追加数据

假设file2.yaml内容:

test1:
  app1:
    app2:|
      "somedata"
app7:
  key2: |
    "testapp"

如果要给test1.app1层级新增app3键,代码:

from ruamel.yaml import YAML

yaml = YAML()
yaml.preserve_quotes = True

with open('file2.yaml', 'r') as f:
    data = yaml.load(f)

# 在test1.app1下追加数据
data['test1']['app1']['app3'] = """
"another new data"
"""

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

修改后的file2.yaml

test1:
  app1:
    app2:|
      "somedata"
    app3: |
      "another new data"
app7:
  key2: |
    "testapp"

方案二:用PyYAML(简单易用,但会丢失原格式)

如果你不在乎原文件的格式(比如换行、注释、块级文本的|标记),PyYAML是更轻量的选择。

步骤1:安装库

pip install pyyaml

示例:给file1.yaml的service1层级追加数据

import yaml

# 读取文件
with open('file1.yaml', 'r') as f:
    data = yaml.safe_load(f)

# 追加同级键值对
data['test3']['service1']['name3'] = '"new data via pyyaml"'

# 写回文件(注意:原有的块级文本会被转成普通字符串)
with open('file1.yaml', 'w') as f:
    yaml.dump(data, f, default_flow_style=False)

执行后,原有的|标记会消失,变成普通字符串格式,适合对格式要求不高的场景。

关键注意点

  • 如果你的YAML文件包含注释、特殊格式,优先用ruamel.yaml,它能最大程度保留原文件结构;
  • 操作前建议备份原文件,避免意外修改;
  • 对于嵌套层级,只要你明确知道键的路径(比如test3 -> service1),就能精准定位到目标位置追加数据,不管文件整体结构如何差异。

内容的提问来源于stack exchange,提问作者user541

火山引擎 最新活动