Python中使用DictReader解析CSV通过用户输入筛选数据的代码排查
问题背景
需要实现基础Python脚本,接收用户输入的年龄,从CSV格式的数据库中筛选出对应年龄的人员姓名,现有代码运行后无法返回预期结果。
原有代码如下:
import csv from encodings import utf_8 from csv import DictReader from multiprocessing import Value from typing import Dict with open('Book.csv', newline='', ) as file : reader= DictReader(file) for row in reader : print(row) ask_age=(input("enterage:")) for row in reader : for key,val in row.items : if ask_age==str in row.items['Age',str] is True : print(row.items['Name',str])
测试用CSV样例如下:
Age,Name,Sex 10,brian,male 30,amilia,female 40,raylie,female
原有代码错误点
- 存在大量冗余导入:
utf_8、Value、Dict三个导入的模块/类在代码中完全没有使用,属于无效代码。 - 迭代器耗尽问题:
DictReader是单向迭代的对象,第一次用for row in reader遍历打印所有行之后,读取指针已经走到文件末尾,后续第二次遍历reader时读不到任何数据。 - 存在多处语法错误:
row.items是字典的方法,调用必须加括号写成row.items()才能拿到键值对,直接写row.items无法获取实际内容- 字典取值的语法错误:字段值直接通过
row[键名]获取即可,比如row['Age']取年龄字段,原有代码写的row.items['Age',str]、row.items['Name',str]是完全错误的写法,既调用了错误的对象,键的传参格式也不对 - 判断逻辑写法错误:原有判断语句
if ask_age==str in row.items['Age',str] is True不符合Python语法规则,筛选只需要判断用户输入值和当前行的Age字段值是否相等即可,不需要冗余的链式判断。
修正后可运行代码
import csv from csv import DictReader with open('Book.csv', newline='', encoding='utf-8') as file: reader = DictReader(file) # 先把所有行读取为列表存储,解决迭代器耗尽无法二次遍历的问题 row_list = list(reader) # 打印全量数据方便核对 for row in row_list: print(row) ask_age = input("enter age:") print("筛选结果:") for row in row_list: # 加strip()去除字段首尾可能存在的空格,避免匹配失败 if row['Age'].strip() == ask_age.strip(): print(row['Name'])
运行效果
使用提供的CSV样例测试时,运行脚本会先打印全量3条数据,输入30后会输出匹配到的姓名amilia,符合筛选需求。
内容的提问来源于stack exchange,提问作者Law Studies
相关产品推荐
相关产品推荐

