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

Python处理学生成绩文本文件变量赋值错位报ValueError如何解决

错误原因

  • 混用文件遍历方式:for line in input_file会自动逐行读取文件内容、移动文件指针,你在循环内部又调用readline(),相当于每轮循环多跳了行,直接导致变量赋值错位,本该读分数的位置读到了身份字段,转int就报错
  • 异常捕获逻辑错误:input()函数不会抛出FileNotFoundError,只有调用open()打开不存在的文件时才会触发该异常,原有的异常捕获完全不生效
  • 读取的内容未处理换行符:readline()返回的字符串末尾自带\n换行符,直接和GRAD/UNDERGRAD做相等判断会匹配失败,无法正常计算等级
  • 缩进错误:分数写入输出文件的代码、额外的readline()调用都放在了for循环外部,无法按学生逐行写入结果
  • 没有使用上下文管理器自动处理文件关闭,容易出现资源泄露问题

修复后可运行代码

# 循环获取输入文件名,直到打开成功
while True:
    filename_one = input('Please enter the name of the input data file: ')
    try:
        # 提前验证文件可打开
        test_open = open(filename_one, 'r')
        test_open.close()
        break
    except FileNotFoundError:
        print(f'Unknown input filename detected {filename_one}.')

filename_two = input('Please enter the name of the output data file: ')

# 用上下文管理器自动处理文件关闭
with open(filename_one, 'r') as input_file, open(filename_two, 'w') as output_file:
    while True:
        # 连续读取3行作为一组学生数据
        under_or_grad = input_file.readline()
        name = input_file.readline()
        grade_line = input_file.readline()
        # 读到文件结尾就退出循环
        if not under_or_grad or not name or not grade_line:
            break
        # 去除每行末尾的换行符和多余空白
        under_or_grad = under_or_grad.strip()
        name = name.strip()
        grade = int(grade_line.strip())
        
        # 按身份计算对应等级
        final_grade = ''
        if under_or_grad == 'GRAD':
            if 95 <= grade <= 100:
                final_grade = 'H'
            elif 80 <= grade <= 94:
                final_grade = 'P'
            elif 70 <= grade <= 79:
                final_grade = 'L'
            elif 0 <= grade <= 69:
                final_grade = 'F'
        elif under_or_grad == 'UNDERGRAD':
            if 90 <= grade <= 100:
                final_grade = 'A'
            elif 80 <= grade <= 89:
                final_grade = 'B'
            elif 70 <= grade <= 79:
                final_grade = 'C'
            elif 60 <= grade <= 69:
                final_grade = 'D'
            elif 0 <= grade <= 59:
                final_grade = 'F'
        
        # 按要求写入结果
        output_file.write(f"{name}\n")
        output_file.write(f"{final_grade}\n")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:45:04