如何将嵌套字典的子字典写入CSV?解决dict_values下标错误
解决dict_values无法下标访问并将子字典写入CSV的问题
问题原因
你碰到的TypeError: 'dict_values' object is not subscriptable错误,是因为new_dict.values()返回的是dict_values视图对象——它是可迭代对象,但不支持像列表那样用下标(比如[0])直接访问元素。
解决方案
有两种简单方式解决这个问题,同时完成CSV写入需求:
方式1:将dict_values转为列表
把视图对象转换成普通列表,就能正常用下标访问第一个子字典的键作为表头:
import csv # 你的数据处理代码 new_dict = {} for ip, host, os, vuln_title, vuln_id, cvss2, cvss3, descr, proof, solu, cves in data[1:]: vuln_data = new_dict.setdefault(vuln_id, {"Vulnerability ID": vuln_id, "Name": host, "Affected IP Address": [], "Risk Exposure": cvss3}) vuln_data["Affected IP Address"].append(ip) # 修正后的CSV写入代码 new_list = list(new_dict.values()) # 转为列表 if new_list: # 先判断字典非空,避免索引错误 keys = new_list[0].keys() with open('output.csv', 'w', newline='', encoding='utf-8') as output_file: dict_writer = csv.DictWriter(output_file, keys) dict_writer.writeheader() # 可选:将列表类型的IP地址转为字符串,避免CSV显示[xxx, xxx]格式 for item in new_list: item["Affected IP Address"] = ', '.join(item["Affected IP Address"]) dict_writer.writerows(new_list)
方式2:用迭代器获取第一个子字典(更高效)
如果字典数据量很大,转列表会占用额外内存,可以直接用迭代器获取第一个子字典的键,无需转换整个视图:
import csv # 数据处理代码同上... if new_dict: # 判断字典非空 # 从迭代器中取出第一个子字典的键 keys = next(iter(new_dict.values())).keys() with open('output.csv', 'w', newline='', encoding='utf-8') as output_file: dict_writer = csv.DictWriter(output_file, keys) dict_writer.writeheader() # 同样处理IP列表转字符串 for vuln_data in new_dict.values(): vuln_data["Affected IP Address"] = ', '.join(vuln_data["Affected IP Address"]) dict_writer.writerows(new_dict.values())
额外提示
- 必须判断
new_dict是否为空,否则无数据时new_list[0]或next(iter(...))会抛出异常 - 写入CSV时建议指定
encoding='utf-8',避免中文乱码 - 子字典中的
Affected IP Address是列表类型,直接写入会显示['192.168.1.1', '192.168.1.2']格式,用', '.join()转成逗号分隔的字符串更符合CSV阅读习惯
内容的提问来源于stack exchange,提问作者Mitchell Privett
相关产品推荐
相关产品推荐

