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

为何For循环仅迭代一次?TSV学生成绩处理代码问题排查

问题排查:Python读取TSV生成成绩报告时循环仅执行一次的问题

问题场景

读取StudentInfo.tsv中的学生成绩数据,生成包含字母等级与平均分的报告文件,但代码中的For循环仅迭代一次,最终输出为[],无法达到预期效果。

输入输出示例

输入的StudentInfo.tsv内容

Barrett    Edan    70  45  59

Bradshaw    Reagan  96  97  88
Charlton    Caius   73  94  80
Mayo    Tyrese  88  61  36
Stern    Brenda  90  86  45

预期输出

Barrett    Edan    70  45  59  F
Bradshaw    Reagan  96  97  88  A
Charlton    Caius   73  94  80  B
Mayo    Tyrese  88  61  36  D
Stern    Brenda  90  86  45  C

Averages: midterm1 83.40, midterm2 76.60, final 61.60

当前问题代码

import csv

def calculate_grade(average_score):
  if average_score >= 90:
      return 'A'
  elif 80 <= average_score < 90:
      return 'B'
  elif 70 <= average_score < 80:
      return 'C'
  elif 60 <= average_score < 70:
      return 'D'
  else:
      return 'F'

tsv_input = str(input())
student_data = []


with open(tsv_input) as file_a:
    tsv_read = file_a.readlines()
    
    for row in tsv_read:
        student_data = [row.strip().split('\t')]

with open('report.txt', 'a+') as final_file:
    for info in student_data:
        last_name, first_name, midterm1, midterm2, final = info
        average_score = (float(midterm1) + float(midterm2) + float(final)) / 3
        
        final_grade = calculate_grade(average_score)
        
        final_file.write(f'{last_name}\t{first_name}\t{midterm1}\t{midterm2}\t{final}\{final_grade}\n')
    final_read = final_file.readlines()
    print(final_read)

问题排查与修复

核心问题点

  1. 列表赋值错误:读取TSV行的循环中,student_data = [row.strip().split('\t')]每次都会覆盖整个列表,而非追加元素,导致student_data仅保留最后一行数据,循环自然只执行一次。
  2. 空行未处理:输入TSV中存在空行,直接分割会生成空列表,后续解构赋值会触发报错。
  3. 文件读取位置错误:a+模式打开文件后,指针默认在文件末尾,直接调用readlines()会读取到空内容,因此输出[]。
  4. 平均分逻辑缺失:原代码未计算三门考试的整体平均分,也未将其写入报告。
  5. 字符串转义错误:写入语句中的\{final_grade}多了一个反斜杠,会导致格式错误。

修正后的代码

def calculate_grade(average_score):
    if average_score >= 90:
        return 'A'
    elif 80 <= average_score < 90:
        return 'B'
    elif 70 <= average_score < 80:
        return 'C'
    elif 60 <= average_score < 70:
        return 'D'
    else:
        return 'F'

tsv_input = input()
student_data = []
# 初始化平均分统计变量
midterm1_total = 0.0
midterm2_total = 0.0
final_total = 0.0
student_count = 0

with open(tsv_input) as file_a:
    for row in file_a.readlines():
        stripped_row = row.strip()
        # 跳过空行
        if not stripped_row:
            continue
        # 适配输入中的空格分隔(原示例为空格而非制表符)
        data = stripped_row.split()
        student_data.append(data)
        # 累加分数用于计算整体平均分
        midterm1_total += float(data[2])
        midterm2_total += float(data[3])
        final_total += float(data[4])
        student_count += 1

# 计算三门考试的整体平均分
avg_midterm1 = midterm1_total / student_count
avg_midterm2 = midterm2_total / student_count
avg_final = final_total / student_count

with open('report.txt', 'w') as final_file:
    # 写入每个学生的成绩与等级
    for info in student_data:
        last_name, first_name, midterm1, midterm2, final = info
        average_score = (float(midterm1) + float(midterm2) + float(final)) / 3
        final_grade = calculate_grade(average_score)
        final_file.write(f'{last_name}\t{first_name}\t{midterm1}\t{midterm2}\t{final}\t{final_grade}\n')
    # 写入空行和平均分信息
    final_file.write('\n')
    final_file.write(f'Averages: midterm1 {avg_midterm1:.2f}, midterm2 {avg_midterm2:.2f}, final {avg_final:.2f}\n')

# 读取并打印报告内容验证结果
with open('report.txt', 'r') as f:
    print(f.read())

修复说明

  • 将列表赋值改为student_data.append(data),实现数据追加,保留所有学生行数据。
  • 添加空行判断逻辑,跳过输入中的空行,避免后续报错。
  • 改用w模式写入文件(覆盖写入,避免多次运行重复追加内容),若需追加可保留a+但需在读取前调用final_file.seek(0)移动指针到文件开头。
  • 修复字符串转义错误,删除多余的反斜杠。
  • 添加整体平均分统计逻辑,计算并写入三门考试的平均分信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 15:32:46