Python使用带字面量大括号的format字符串触发KeyError报错
报错触发原因
Python内置str.format()方法会将字符串内的单个大括号{、}识别为占位符边界:
{0}、{1}这类写法是位置占位符,按顺序匹配传入的位置参数{key}这类写法是命名占位符,会匹配传入的关键字参数对应键名
原代码中用于包裹JSON结构的字面量大括号未做转义,均为单个书写。format执行时,会从第一个{开始向后匹配对应的},将中间的整段内容\r\n "Code"识别为命名占位符的键名,由于调用format时未传入对应该键名的参数,直接触发KeyError。
修复方案
方案1:转义字面量大括号
str.format()语法规定,若要输出作为普通字符的大括号,需要将大括号双写完成转义:{写为{{,}写为}},修改后代码如下:
Code = "00000" Number = "111-111-1111" output = "{{\r\n \"Code\":\"{0}\",\r\n \"PhNumber\": \"{1}\"\r\n}}".format(Code, Number) print(output)
运行后可输出预期格式的内容。
方案2(推荐):使用标准库json模块序列化
手动拼接JSON字符串极易出现大括号转义、特殊字符转义错误,更稳妥的方式是使用Python标准库json模块:先构造对应结构的字典,再序列化为JSON字符串,无需手动处理任何格式转义,还可通过indent参数直接控制缩进排版:
import json Code = "00000" Number = "111-111-1111" data = { "Code": Code, "PhNumber": Number } # indent参数设置缩进空格数,可匹配预期排版效果 output = json.dumps(data, indent=4) print(output)
该写法鲁棒性更强,后续即使字段值包含引号、换行、特殊符号,也不会生成非法格式的JSON内容。
内容的提问来源于stack exchange,提问作者jtom
相关产品推荐
相关产品推荐

