Python 2.6中使用.format()方法时出现KeyError问题求助
解决字符串格式化时的KeyError问题
我来帮你捋清楚这个错误的原因,以及怎么修复它:
问题根源
你现在的代码流程是先把字典转成JSON字符串,再调用format(),但这会触发Python字符串格式化的误解:
- 当你执行
json.dumps(data)后,原来的字典值'{0}'会被转换成JSON格式的字符串'"{0}"',最终生成的JSON字符串看起来是这样的:{"u_in_record_type": "{0}", "u_company_source": "{1}"} - Python的
str.format()方法会把JSON里的{"u_in_record_type": ...}中的{u_in_record_type}当成命名占位符,试图去查找名为"u_in_record_type"的参数,可你只传了type和source,自然就抛出KeyError了。
另外还要注意:别用type作为变量名,它是Python的内置函数,这样命名会覆盖内置功能,容易引发其他问题。
修复方案
最合理的做法是先完成字符串格式化,再把字典转成JSON,这样就能避免格式冲突:
import json # 换个变量名,避免覆盖内置函数type record_type = "Test" company_source = "Test" # 先替换占位符,再生成JSON data = { "u_in_record_type": '{0}'.format(record_type), "u_company_source": '{1}'.format(company_source) } data_json = json.dumps(data) print(data_json)
如果你一定要先转成JSON再格式化(这种场景很少见),需要把JSON结构里的{}转义成{{}},这样format()就不会把它们当成占位符了:
import json record_type = "Test" company_source = "Test" # 先把字典里的占位符保留,把JSON结构的{}转义 data = { "u_in_record_type": '{0}', "u_company_source": '{1}' } # 转成JSON后,把{}替换成{{}},只保留{0}{1}作为占位符 data_json = json.dumps(data).replace("{", "{{").replace("}", "}}").replace("{{0}}", "{0}").replace("{{1}}", "{1}") print(data_json.format(record_type, company_source))
显然第一种方案更简洁易维护,优先推荐。
内容的提问来源于stack exchange,提问作者Roy Holzem
相关产品推荐
相关产品推荐

