如何在Python中覆盖TXT文件内同名学生的成绩记录
如何在Python中写入学生成绩时覆盖同名学生的旧记录
问题背景
当前有一个存储学生成绩的.txt文件,内容如下:
Adam,3,2,4 Sorin,3,2,4 Sorin,0,0,0
使用的Python代码片段是追加记录到文件中,但当再次写入同名学生(比如Sorin的新成绩3,3,3)时,文件会新增重复条目,而需求是覆盖该学生所有旧记录,仅保留最新成绩,最终文件只保留Adam和最新的Sorin记录。
原代码片段:
new_record = studentName+","+str(Score1) +","+str(Score2) +","+str(Score3) student_class = 0 while student_class != 1 or student_class != 2 or student_class != 3: student_class=input("What class are you in?(1/2/3): ") if student_class == "1": file=open("Class1.txt", "a+") file.write(new_record) file.write("\n") file.close() with open("Class1.txt", 'r') as fp: for count, line in enumerate(fp): pass break
解决方案
修改后的代码会先读取文件中所有非目标学生的记录,再将新记录写入,实现覆盖效果,同时修复原循环的逻辑错误:
# 假设studentName、Score1、Score2、Score3已提前定义好 new_record = f"{studentName},{Score1},{Score2},{Score3}" student_class = "" # 修复循环条件:判断输入是否为有效班级选项 while student_class not in ["1", "2", "3"]: student_class = input("What class are you in?(1/2/3): ") # 根据选择的班级确定目标文件 class_file = f"Class{student_class}.txt" updated_records = [] # 读取现有记录,过滤掉当前学生的旧记录 try: with open(class_file, 'r') as fp: for line in fp: line = line.strip() if not line: continue # 拆分每行获取学生姓名 existing_name = line.split(',')[0] if existing_name != studentName: updated_records.append(line) except FileNotFoundError: # 文件不存在时直接跳过读取步骤 pass # 添加最新的学生成绩记录 updated_records.append(new_record) # 将更新后的所有记录写入文件 with open(class_file, 'w') as fp: fp.write('\n'.join(updated_records) + '\n')
关键说明
- 覆盖旧记录逻辑:读取文件时筛选出非目标学生的记录,再加入新记录,相当于直接替换掉该学生的所有旧数据。
- 修复循环错误:原代码的
or逻辑会导致循环永远无法终止,改用not in判断输入是否在有效范围内,逻辑更准确简洁。 - 安全文件操作:全程使用
with语句自动管理文件的打开/关闭,避免资源泄漏;同时处理文件不存在的情况,确保首次写入正常执行。 - 优化字符串拼接:用f-string替代原有的字符串相加,代码更简洁易读。
内容的提问来源于stack exchange,提问作者niub
相关产品推荐
相关产品推荐

