CSV文件ID校验代码仅读取首行问题排查求助
问题排查与修复方案
嘿,我帮你找出了代码只处理第一行就停止的核心问题,同时也优化了一些逻辑漏洞,下面是详细分析和修复后的代码:
为什么只处理第一行?
最关键的原因是你的CSV数据是空格分隔的,但csv.DictReader默认用逗号作为分隔符,这会导致解析出来的行数据完全不符合预期——后续行可能被识别成无效格式,或者直接被跳过。
除此之外,代码还有几个逻辑和流程上的小问题,也会影响执行效果:
- 表头打印放在了循环结束后,导致输出顺序混乱
avg_score初始值设为整数0,和字符串类型的ID最后一位比较时会触发不必要的错误- 多余的
del remarks操作,其实直接清空列表就够了 - 错误信息的输出逻辑零散,没有和对应的用户信息绑定
修复后的完整代码
import csv filePath = "data3.csv" # 定义错误提示信息,变量名更清晰 length_error = "Length of Avatar ID is not 5 " name_tribe_error = "Invalid first letter" score_grade_error = "Invalid last letter" mid_integers_error = "Invalid integers" score_format_error = "Invalid score values" def isValidAvatarIDFormat(): # 重点:指定CSV分隔符为空格,匹配你的数据格式 with open(filePath, newline='') as csvfile: reader = csv.DictReader(csvfile, delimiter=' ') # 先打印表头,让输出结构更清晰 print("{0:<15}{1:<15}{2:<30}".format("Avatar Name", "Avatar ID", "Comments")) print("-" * 60) for row in reader: remarks = [] # 提取行内关键数据,让代码更易读 avatar_name = row['name'] avatar_id = row['id'] tribe = row['tribe'] # 校验ID长度 if len(avatar_id) != 5: remarks.append(length_error) # 校验部落首字母与ID首字母一致 if tribe[0] != avatar_id[0]: remarks.append(name_tribe_error) # 计算平均分并校验等级匹配ID最后一位 avg_score = None scores = [row['Air'], row['Water'], row['Earth'], row['Fire']] if all(score.isdigit() for score in scores): average = sum(int(score) for score in scores) / 4 # 简化等级判断逻辑 if average >= 80: avg_score = "A" elif average >= 70: avg_score = "B" elif average >= 60: avg_score = "C" elif average >= 50: avg_score = "D" elif average >= 40: avg_score = "E" else: avg_score = "F" else: remarks.append(score_format_error) # 只有当平均分计算有效时,才校验等级与ID最后一位 if avg_score is not None and avg_score != avatar_id[-1]: remarks.append(score_grade_error) # 校验ID中间三位是否为数字 if not all(char.isdigit() for char in avatar_id[1:4]): remarks.append(mid_integers_error) # 整理评论内容,无错误则显示有效 comment = "; ".join(remarks) if remarks else "Valid ID" # 打印当前行的校验结果 print("{0:<15}{1:<15}{2:<30}".format(avatar_name, avatar_id, comment)) isValidAvatarIDFormat()
修复亮点说明
- 适配CSV分隔符:添加
delimiter=' '参数,确保空格分隔的CSV数据被正确解析,这是解决“只处理第一行”的核心 - 优化输出结构:提前打印表头,每行结果和用户信息一一对应,可读性更强
- 修复类型不匹配问题:将
avg_score初始值设为None,避免整数和字符串直接比较的逻辑错误 - 简化代码逻辑:用
all(char.isdigit() for char in avatar_id[1:4])替代重复的判断,更简洁 - 完善错误提示:新增分数格式错误的提示,让校验更全面
用你的测试数据运行这段代码,会正确处理两行数据并输出对应的校验结果。
内容的提问来源于stack exchange,提问作者Hao
相关产品推荐
相关产品推荐

