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
相关产品推荐
相关产品推荐

