Python写入CSV时出现List has no attribute 'keys'报错如何解决
List has no attribute 'keys' 报错排查与修复方案 报错核心原因
这个报错100%是因为你在代码中对列表类型的对象调用了只有字典才有的.keys()方法,结合你写接口数据转CSV的场景,90%的触发场景是使用csv.DictWriter时,误将列表对象当成字典传入了需要字典参数的逻辑里。
排查步骤
- 先根据报错栈定位到调用
.keys()的具体代码行,在该行前加类型打印语句,确认你操作的对象实际类型:# 把your_var替换成你调用.keys()的那个变量 print(type(your_var), your_var[:2] if isinstance(your_var, list) else your_var) - 对照接口返回的JSON结构逐层核对:
- 绝大多数接口返回的结构是响应状态码 + 业务数据列表的嵌套格式,比如
{"code":0, "msg":"success", "data": [{"字段1":"值1", "字段2":"值2"}, {...}]},如果你直接对整个接口响应结果调用.keys()取表头、或者直接把整个响应传给DictWriter.writerows(),就会因为操作的对象层级不对触发报错——你真正要写入CSV的字典列表,是嵌套在data字段下的数组,不是响应最外层。 - 检查你要写入的单条记录里,是否存在值为列表类型的字段,如果你误对这类字段值调用
.keys()也会触发报错。
- 绝大多数接口返回的结构是响应状态码 + 业务数据列表的嵌套格式,比如
修复方案
按照预期CSV输出效果,直接参考下面的可运行逻辑调整即可:
import csv import requests # 拉取接口JSON数据 response = requests.get("替换为你的实际接口地址") response.raise_for_status() json_resp = response.json() # !!这里替换为你实际JSON里存目标数据的列表路径 # 如果接口最外层直接返回列表,就写 record_list = json_resp # 如果数据在data字段下,就写 record_list = json_resp["data"] record_list = json_resp["data"] # 前置校验:确保拿到的是列表、且列表内元素是字典 if not isinstance(record_list, list) or len(record_list) == 0: raise ValueError("接口返回的待写入数据格式不符合预期,或数据为空") if not isinstance(record_list[0], dict): raise ValueError("数据列表内的元素不是字典格式,无法取键生成CSV表头") # 写入CSV with open("result.csv", "w", encoding="utf-8-sig", newline="") as csvfile: # 取第一条记录的键作为CSV表头 writer = csv.DictWriter(csvfile, fieldnames=record_list[0].keys()) writer.writeheader() for row in record_list: # 预处理列表/字典类型的字段,转成字符串避免写入异常 processed_row = {} for key, value in row.items(): if isinstance(value, (list, dict)): processed_row[key] = str(value) else: processed_row[key] = value writer.writerow(processed_row)
注意事项
- 如果你的JSON存在多层嵌套(比如
{"info": {"create_time":"2024-01-01", "author":"xxx"}}),需要提前把嵌套字段拍平,否则写入CSV的会是字典的原生字符串表示,不符合可读要求。 - 写入CSV时指定
encoding="utf-8-sig"可以避免中文乱码问题,加newline=""可以避免CSV出现多余空行。
内容的提问来源于stack exchange,提问作者ChrisyDeveloper
相关产品推荐
相关产品推荐

