如何用Python为已有YAML文件中Bird节点的Pet变量添加值?
用Python更新YAML文件的正确方式
我们需要修改以下input.yml文件,为Animal节点下Bird的Pet列表添加新值(比如Duck和Swan):
version: "3.2" Animal: mamal: wild: - Tiger - Lion Pet: - Dog - Cat Bird: wild: - Peacock - Ostrich Pet: - Parrot - Dove Fish: Sea: - Shark - whale
原代码的问题
你提供的代码存在几个关键错误:
- 用
yaml.safe_load_all()读取单个YAML文档,得到的是包含单个字典的列表,后续遍历逻辑完全错误 - 循环遍历的是列表中的字典对象,而非索引,
'Animal' in contents1[k]的写法不符合语法逻辑 - 使用
append(['Duck','swan'])会把整个列表作为单个元素插入Pet列表,而非添加两个独立元素
正确实现代码
import yaml # 读取单个YAML文档,用safe_load即可 with open('input.yml', 'r') as read_file: data = yaml.safe_load(read_file) # 定位到目标节点,批量添加新元素 data['Animal']['Bird']['Pet'].extend(['Duck', 'Swan']) # 如果是单个元素添加,也可以用: # data['Animal']['Bird']['Pet'].append('Duck') # data['Animal']['Bird']['Pet'].append('Swan') # 将修改后的数据写回文件,保留原格式风格 with open('input.yml', 'w') as write_file: yaml.dump( data, write_file, default_flow_style=False, # 保持块级格式,和原文件一致 sort_keys=False # 保留原键的顺序,避免自动排序打乱结构 )
关键说明
- 单个YAML文档用
yaml.safe_load()读取即可,safe_load_all()适用于多文档场景 extend()用于给列表批量添加多个元素,append()则是添加单个元素sort_keys=False可以避免默认的字母排序,保留原文件的键顺序default_flow_style=False确保输出的YAML是易读的块格式,而非紧凑的流格式
内容的提问来源于stack exchange,提问作者CodingNinja
相关产品推荐
相关产品推荐

