Python实现YAML文件中SQL占位符批量替换及报错解决
解决YAML文件中SQL占位符批量替换的问题
我来帮你一步步搞定这个问题~首先你的报错ValueError: too many values to unpack是因为循环逻辑写错了:data['new']['extracts']是一个列表,里面每个元素是带sql键的字典,你手动维护索引i再尝试拆包k, v的方式完全搞错了遍历逻辑——直接遍历字典默认只会拿到键,没法拆成键值对,而且手动递增索引完全没必要。
下面是修正后的完整方案,我会逐个环节解释清楚:
1. 安全加载YAML文件
首先千万不要用yaml.load(),它存在安全风险(可能执行恶意代码),改用yaml.safe_load():
import yaml input_file = "my_file.yaml" output_file = "updated_my_file.yaml" # 建议先输出到新文件,确认无误后再覆盖原文件 # 加载YAML数据 with open(input_file, 'r', encoding='utf-8') as f: data = yaml.safe_load(f)
2. 正确遍历并替换占位符
data['new']['extracts']是列表,直接遍历每个条目,找到sql字段进行替换即可:
# 定义要替换的占位符和新值 placeholder = "{{ place-holder }}" new_value = "new_str" # 遍历所有extract条目 for extract in data['new']['extracts']: # 加个判断避免因条目无sql键抛出错误 if 'sql' in extract: extract['sql'] = extract['sql'].replace(placeholder, new_value)
3. 将修改后的数据写回YAML文件
用yaml.dump()写入时,加上几个参数可以保证输出的YAML格式和原文件一致(不打乱结构、保持块风格):
with open(output_file, 'w', encoding='utf-8') as f: yaml.dump( data, f, default_flow_style=False, # 使用块风格,和原文件格式匹配 sort_keys=False, # 保持原有的键顺序,不会自动排序 allow_unicode=True # 支持中文等Unicode字符 )
完整整合代码
import yaml def update_yaml_sql_placeholders(input_path, output_path, placeholder, new_value): # 加载YAML数据 with open(input_path, 'r', encoding='utf-8') as f: data = yaml.safe_load(f) # 批量替换SQL占位符 for extract in data['new']['extracts']: if 'sql' in extract: extract['sql'] = extract['sql'].replace(placeholder, new_value) # 写入修改后的数据 with open(output_path, 'w', encoding='utf-8') as f: yaml.dump( data, f, default_flow_style=False, sort_keys=False, allow_unicode=True ) # 调用函数执行替换 if __name__ == "__main__": update_yaml_sql_placeholders( input_path="my_file.yaml", output_path="updated_my_file.yaml", placeholder="{{ place-holder }}", new_value="new_str" )
额外提醒
- 如果想直接覆盖原文件,把
output_path改成和input_path一致即可,但一定要先备份原文件,避免意外。 - 如果你的YAML里
extracts的部分条目可能没有sql键,if 'sql' in extract的判断能帮你避免KeyError报错。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

