Python开发CSV列筛选功能时自定义过滤函数未按预期执行问题
代码问题原因及修复方案
你的CSV文件已经成功打开,问题均为代码语法逻辑错误导致,具体错误共3处:
- 问题1:
abrir_csv函数列表推导式写法错误
你给生成namedtuple的表达式额外套了一层括号,导致列表中仅存入1个生成器对象,而非预期的多条namedtuple实例数据。
错误写法:contenido=[(Almacenamiento_de_datos(...) for ... in lector)]
外层括号会把内部逻辑识别为生成器,不会逐个生成元素填充列表。 - 问题2:
Filtrar_Contenido函数格式化逻辑位置错误
你将遍历逻辑写在了format方法的参数内,实际格式化的是整个生成器对象,而非每个用户的名字字段。
错误写法:contenido1 = {"{}".format(s.Nombres for s in Doc)}
这行代码只会生成1个元素,即生成器对象的字符串地址。 - 问题3:打印函数无返回值
你在TestFiltro_nombres中打印Tetscontador的执行结果,但该函数仅做打印操作,没有return语句,默认返回None,因此控制台会额外输出None。
修正后的代码
1. CSV读取函数
def abrir_csv (Doc): with open( Doc , encoding='utf-8') as f: lector = csv.reader(f) next(lector) # 移除生成器外层多余的括号,使用标准列表推导式 contenido = [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 lector] return contenido
2. 内容过滤函数
def Filtrar_Contenido (Doc): # 将遍历逻辑移到集合推导式外层,逐个格式化名字字段 contenido1 = {"{}".format(s.Nombres) for s in Doc} return contenido1
3. 结果打印逻辑
def Tetscontador(datos): for dato in datos: print(dato) def TestFiltro_nombres(fichero): # 移除多余的外层print,Tetscontador本身已完成打印操作 Tetscontador(Filtrar_Contenido(fichero)) print("Estos son los nombres de las personas desaparecidas")
内容的提问来源于stack exchange,提问作者Crstian Martin
相关产品推荐
相关产品推荐

