Python format报IndexError: Replacement index 0 out of range
报错原因
第一次调用str.format()时,Python会扫描字符串内所有大括号标记的占位符做匹配替换。当前模板字符串同时包含命名占位符{idnumber}和位置占位符{0},但本次调用仅传入了idnumber=nomor一个关键字参数,未给位置占位符{0}提供对应替换值,直接触发索引越界错误,代码不会执行到第二次format的逻辑。
修复方案
可任选以下一种方式修改代码:
- 转义二次替换的占位符:第一次format时,把不需要在当前轮次替换的
{0}写成{{0}},双大括号会被format解析为普通的单大括号文本,不会被识别为待替换占位符,核心代码修改如下:
import sys nomor = sys.argv[1] ..... # values后的占位符用双大括号包裹,避免第一轮format解析 query = "insert into {idnumber}_recipe values ({{0}})".format(idnumber = nomor) query = query.format(','.join(['%s'] * len(data))) .....
- 用f-string一次性完成拼接(Python 3.6及以上版本支持),无需分两次调用format,逻辑更清晰不易出错:
import sys nomor = sys.argv[1] ..... value_placeholder = ','.join(['%s'] * len(data)) query = f"insert into {nomor}_recipe values ({value_placeholder})" .....
- 安全提示:直接把命令行传入的参数拼接到SQL语句中存在SQL注入风险,拼接表名前必须做白名单校验,确认传入的
nomor符合表名命名规则,禁止直接透传未校验的外部输入。
更新:提问者已自行找到问题解决方案。
内容的提问来源于stack exchange,提问作者Benjamin Murdo
相关产品推荐
相关产品推荐

