You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:24:54