将字典写入CSV文件时遇TypeError: String indices must be integers错误求助
解决CSV生成时的"String indices must be integers"错误
想要生成表头为['Username', 'INFO', 'ERROR']的CSV表格,遇到"String indices must be integers"错误,尝试排查后仍无法解决,以下是代码及报错信息:
import csv dict_data = {'ac': {'INFO': 2, 'ERROR': 2}, 'ahmed.miller': {'INFO': 2, 'ERROR': 4}, 'blossom': {'INFO': 2, 'ERROR': 6}, 'bpacheco': {'INFO': 0, 'ERROR': 2}, 'breee': {'INFO': 1, 'ERROR': 5}, 'britanni': {'INFO': 1, 'ERROR': 1}, 'enim.non': {'INFO': 2, 'ERROR': 3}, 'flavia': {'INFO': 0, 'ERROR': 5}, 'jackowens': {'INFO': 2, 'ERROR': 4}, 'kirknixon': {'INFO': 2, 'ERROR': 1}, 'mai.hendrix': {'INFO': 0, 'ERROR': 3}, 'mcintosh': {'INFO': 4, 'ERROR': 3}, 'mdouglas': {'INFO': 2, 'ERROR': 3}, 'montanap': {'INFO': 0, 'ERROR': 4}, 'noel': {'INFO': 6, 'ERROR': 3}, 'nonummy': {'INFO': 2, 'ERROR': 3}, 'oren': {'INFO': 2, 'ERROR': 7}, 'rr.robinson': {'INFO': 2, 'ERROR': 1}, 'sri': {'INFO': 2, 'ERROR': 2}, 'xlg': {'INFO': 0, 'ERROR': 4}} with open("testinggg.csv", 'w') as output: fields = ['Username', 'INFO', 'ERROR'] writer = csv.DictWriter(output, fieldnames=fields) writer.writeheader() for m in dict_data: print(m) writer.writerow({'Username': str(m[0]), 'INFO': str(m[1]['error']), 'ERROR': str(m[1]['info'])})
报错信息:
Traceback (most recent call last): File "<stdin>", line 3, in <module> TypeError: string indices must be integers
错误原因分析
- 直接遍历
dict_data时,变量m是字典的键(字符串类型),比如'ac',此时m[0]会取字符串第一个字符,但m[1]会报错——要么字符串长度不足,要么误解了遍历方式,误以为m是(key, value)对。 - 代码中用小写的
'error'和'info'访问字典键,但原数据里的键是大写的'ERROR'和'INFO',即使遍历方式正确,也会引发KeyError。
解决方案及修正代码
修正关键点:
- 使用
dict_data.items()遍历,同时获取用户名(键)和对应的统计数据(值) - 直接使用用户名作为
Username字段值,无需截取字符 - 匹配原字典的键名,使用大写的
'INFO'和'ERROR'
修正后的代码:
import csv dict_data = {'ac': {'INFO': 2, 'ERROR': 2}, 'ahmed.miller': {'INFO': 2, 'ERROR': 4}, 'blossom': {'INFO': 2, 'ERROR': 6}, 'bpacheco': {'INFO': 0, 'ERROR': 2}, 'breee': {'INFO': 1, 'ERROR': 5}, 'britanni': {'INFO': 1, 'ERROR': 1}, 'enim.non': {'INFO': 2, 'ERROR': 3}, 'flavia': {'INFO': 0, 'ERROR': 5}, 'jackowens': {'INFO': 2, 'ERROR': 4}, 'kirknixon': {'INFO': 2, 'ERROR': 1}, 'mai.hendrix': {'INFO': 0, 'ERROR': 3}, 'mcintosh': {'INFO': 4, 'ERROR': 3}, 'mdouglas': {'INFO': 2, 'ERROR': 3}, 'montanap': {'INFO': 0, 'ERROR': 4}, 'noel': {'INFO': 6, 'ERROR': 3}, 'nonummy': {'INFO': 2, 'ERROR': 3}, 'oren': {'INFO': 2, 'ERROR': 7}, 'rr.robinson': {'INFO': 2, 'ERROR': 1}, 'sri': {'INFO': 2, 'ERROR': 2}, 'xlg': {'INFO': 0, 'ERROR': 4}} with open("testinggg.csv", 'w', newline='') as output: fields = ['Username', 'INFO', 'ERROR'] writer = csv.DictWriter(output, fieldnames=fields) writer.writeheader() for username, stats in dict_data.items(): writer.writerow({ 'Username': username, 'INFO': stats['INFO'], 'ERROR': stats['ERROR'] })
补充说明:
- 添加
newline=''是为了避免Windows系统下CSV出现空行的问题 - 无需将整数转成字符串,
csv.DictWriter会自动处理数据类型
内容的提问来源于stack exchange,提问作者Kokonoeyuki
相关产品推荐
相关产品推荐

