You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

修复亮点说明

  1. 适配CSV分隔符:添加delimiter=' '参数,确保空格分隔的CSV数据被正确解析,这是解决“只处理第一行”的核心
  2. 优化输出结构:提前打印表头,每行结果和用户信息一一对应,可读性更强
  3. 修复类型不匹配问题:将avg_score初始值设为None,避免整数和字符串直接比较的逻辑错误
  4. 简化代码逻辑:用all(char.isdigit() for char in avatar_id[1:4])替代重复的判断,更简洁
  5. 完善错误提示:新增分数格式错误的提示,让校验更全面

用你的测试数据运行这段代码,会正确处理两行数据并输出对应的校验结果。

内容的提问来源于stack exchange,提问作者Hao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:27:39