如何灵活向不同嵌套结构的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




