从嵌套字典提取数据时遇TypeError: string indices must be integers错误
解决TypeError: string indices must be integers的问题
兄弟,你踩的这个坑太常见了——account_info['payload']根本不是嵌套字典,而是一个字符串!你看它的取值是被双引号包裹的u"{'account_title': u’sam b’, ...}",本质是字符串类型,所以当你尝试用['email_address']这种字典键去索引字符串时,Python自然会报错说“字符串索引必须是整数”。
下面给你两种靠谱的解决方法:
方法1:用ast.literal_eval(推荐,安全)
ast.literal_eval是Python标准库ast里的方法,它能安全地把字符串形式的Python字面量(比如字典、列表)转换成对应的对象,比直接用eval安全多了(eval会执行字符串里的任意代码,风险很高)。
代码示例:
import ast # 你的原始字典 account_info = {u'id': u'000123', u'payload': u"{'account_title': u’sam b’, 'phone_num': ‘1234567890’, 'security_pin': u'000000', 'remote_word': u’secret123’, 'email_address': ‘email@gmail.com’, 'password': u’password123’}"} # 将payload字符串转换为真正的字典 payload_dict = ast.literal_eval(account_info['payload']) # 现在可以正常访问email_address了 print(payload_dict['email_address']) # 输出: email@gmail.com
方法2:用json.loads(需处理引号格式)
如果你的payload字符串能转换成标准JSON格式,也可以用json.loads,但要注意JSON要求键和字符串必须用双引号,而且你的字符串里还有中文单引号(‘和’),得先替换成英文引号:
代码示例:
import json account_info = {u'id': u'000123', u'payload': u"{'account_title': u’sam b’, 'phone_num': ‘1234567890’, 'security_pin': u'000000', 'remote_word': u’secret123’, 'email_address': ‘email@gmail.com’, 'password': u’password123’}"} # 先清理引号:把中文单引号换成英文单引号,再把所有单引号换成双引号 clean_payload = account_info['payload'].replace("‘", "'").replace("’", "'").replace("'", '"') # 转换为字典 payload_dict = json.loads(clean_payload) print(payload_dict['email_address']) # 输出: email@gmail.com
额外提醒
- 优先用
ast.literal_eval,尤其是当payload内容来自不可信来源时,避免安全风险; - 注意字符串里的非标准引号(比如中文引号),转换前要先处理成英文引号,否则会触发解析错误。
内容的提问来源于stack exchange,提问作者srb7
相关产品推荐
相关产品推荐

