You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 13:17:35