Python:函数结果传入DictWriter报错AttributeError,求解决
问题解决:AttributeError: 'list' object has no attribute 'keys' 处理方案
错误原因定位
你遇到的问题核心是第一个函数nameinfo返回的不是字典组成的列表,而是列表嵌套列表的结构。当csv.DictWriter.writerows()接收这个结构时,会把列表里的每个子列表当成要写入的行(期望是字典),调用rowdict.keys()自然会报错——列表没有keys属性。
看你的第一个函数代码,有三个明显问题:
- 循环内部第一次迭代就执行
return returnlist,导致函数直接返回,不会遍历所有名字 - 调用
get_all_names时传入的是整个namelist,而非当前循环的单个名字names - 循环变量
names没有被正确使用,逻辑上是遍历单个名字,却传入了整个列表
修正后的代码
第一个函数修正
假设get_all_names(name)是接收单个名字、返回对应信息字典的函数,修正后的nameinfo应该是:
import csv namelist = ["Jacob", "Bella", "Edward"] def nameinfo(list_of_names): returnlist = [] for name in list_of_names: # 遍历传入的名字列表,用单个name变量 final = get_all_names(name) # 传入单个名字,获取对应字典 returnlist.append(final) return returnlist # 循环结束后再返回完整列表 namesofthepeople = nameinfo(namelist)
第二个函数优化
建议加上表头写入,让CSV结构更清晰:
def write_nameinfo(names, csvfile): with open(csvfile, 'w', newline='') as f: fieldnames = ['name', 'age','count', 'birthyear'] writer = csv.DictWriter(f, fieldnames=fieldnames) writer.writeheader() # 写入表头 writer.writerows(names) write_nameinfo(namesofthepeople, "prince.csv")
验证要点
确保get_all_names(name)返回的是符合字段要求的字典,示例结构如下(根据你的实际逻辑调整):
def get_all_names(name): return { 'name': name, 'age': 25, 'count': 1, 'birthyear': 1998 }
这样nameinfo返回的就是[{'name':'Jacob',...}, {'name':'Bella',...}, ...]的正确结构,writerows就能正常处理每个字典,不会再触发属性错误。
内容的提问来源于stack exchange,提问作者Serhat
相关产品推荐
相关产品推荐

