Python实现传入学生姓名参数获取CSV对应第二列分数的方法
原有代码问题说明
你写的代码存在几处语法和逻辑错误,无法实现按姓名查询分数的需求,具体问题如下:
- 入参未参与匹配逻辑:函数定义的入参
tables没有用来和CSV内的姓名做比对,传入任何值都不会影响返回结果 - 列名引用错误:CSV第一列是学生姓名,代码中写的
table-name列和实际文件结构不匹配 - 变量未定义:代码里声明的分数变量是
pkey,打印、返回时调用的是未声明的marks,运行会直接触发NameError - 返回逻辑位置错误:
return语句写在了for循环内部,第一次循环就会终止函数,根本不会遍历所有行做匹配 - 错误的类型转换:分数一般是数值类型,对数值调用
.lower()方法会触发属性错误,没有实际意义
可直接运行的修正代码
import pandas as pd def get_student_score(student_name): # 读取CSV文件,注意如果是S3路径需要提前安装s3fs依赖,执行pip install s3fs即可 score_df = pd.read_csv("s3://test.csv", sep=",") # 入参和CSV姓名统一转小写,避免大小写导致匹配失败,比如Naveen和naveen会识别为同一人 target_name = student_name.lower() # 遍历行做匹配 for _, row in score_df.iterrows(): current_name = str(row[0]).lower() # 取第一列的姓名做比对 if current_name == target_name: return row[1] # 匹配成功返回第二列的分数 # 遍历完所有行没找到匹配项时返回提示 return f"未找到学生{student_name}的成绩记录" # 测试查询 res = get_student_score("naveen") print(res)
更简洁的pandas原生写法
不需要手动写循环,用pandas自带的布尔索引过滤即可,性能更好代码也更短:
import pandas as pd def get_student_score(student_name): score_df = pd.read_csv("s3://test.csv", sep=",") # 直接按姓名列做条件过滤 match_result = score_df[score_df.iloc[:, 0].str.lower() == student_name.lower()] if not match_result.empty: return match_result.iloc[0, 1] return f"未找到学生{student_name}的成绩记录" res = get_student_score("naveen") print(res)
补充说明:如果你的CSV文件有明确表头,比如第一列表头是
name、第二列表头是score,可以把代码里的iloc[:,0]替换为['name']、iloc[:,1]替换为['score'],代码可读性会更高。
内容的提问来源于stack exchange,提问作者Santosh Kumar
相关产品推荐
相关产品推荐

