Python不使用Pandas过滤CSV时报generator object is not subscriptable错误
CSV列过滤功能错误修复方案
错误根因
你遇到的TypeError: 'generator' object is not subscriptable报错由以下几个问题共同导致:
- 列表构造逻辑错误:
Archivo_Csv函数中你用lista =[(生成器表达式)]的写法,会直接把整个生成器对象作为列表的唯一元素,遍历lista时拿到的i是生成器对象,无法进行下标或属性访问。 - namedtuple访问方式错误:namedtuple不能像字典一样用
i['属性名']的方式访问,需要用点语法i.属性名,或者先调用._asdict()转为字典后再用下标访问。 - 函数逻辑错误:
next()是迭代器遍历专用方法,你直接传入属性值属于误用;且原函数在循环第一次就直接return,只会返回第一条数据的内容,无法获取所有行的指定两列。
修复后代码
TestFiltraor.py 代码
import csv from collections import namedtuple Almacenamiento_de_datos = namedtuple('DESAPARECIDOS_INDIA_2018_2020', 'Tipo_de_sangre,Nombres,Genero,Cuerpo,Distrito,DENUNCIADO,Estatura,Edad,Cuando_Desparecio') def Archivo_Csv(Archivo): with open(Archivo, encoding = 'utf-8') as f: lineador = csv.reader(f, delimiter=";") next(lineador) # 改为列表推导式,直接生成namedtuple组成的列表,去掉多余的小括号 lista = [Almacenamiento_de_datos(Tipo_de_sangre, Nombres, Genero, Cuerpo, Distrito, DENUNCIADO, float(Estatura), int(Edad), Cuando_Desparecio) for Tipo_de_sangre, Nombres, Genero, Cuerpo, Distrito,DENUNCIADO, Estatura, Edad, Cuando_Desparecio in lineador] return lista def Todos_Los_nombres(lista): res = [] for fila in lista: # 用点语法访问namedtuple属性,收集所有行的姓名和年龄 res.append( (fila.Nombres, fila.Edad) ) return res
调用代码
from TestFiltraor import Archivo_Csv, Todos_Los_nombres def TestFiltrador(Desaparecidoscsv): Nom = Todos_Los_nombres(Desaparecidoscsv) print("Los nombres y sus edad son : ") for nombre, edad in Nom: print(f"姓名:{nombre},年龄:{edad}") # 运行示例 if __name__ == "__main__": # 替换为你的CSV文件路径 datos = Archivo_Csv("tu_archivo.csv") TestFiltrador(datos)
功能验证
运行后会逐行打印CSV文件中所有行的Nombres和Edad两列内容,无需依赖Pandas库。
内容的提问来源于stack exchange,提问作者Crisdax Music Infinity
相关产品推荐
相关产品推荐

