从文本文件删除指定ID学生记录时如何保留原有存储格式
问题描述
学生数据库按照 id:name:courses:semester:year 的顺序用冒号拼接存储,每行对应一条学生记录。
原始文件内容
1111:rikki:2:3:1 2222:jackk:2:3:1 3333:sam:3:3:1
原代码运行后的异常结果
rikki:2:3:1:2222:jackk:2:3:1:3333:sam:3:3:1:
原有问题代码
def remove_student(): infile = open("lol.txt", "r") f = infile.readlines() new_list = [] id = input('enter your id:') for line in f: for item in line.split(':'): new_list.append(item.strip()) write_file = open("lol.txt",'w') for lines in new_list: if lines != id: write_file.write(lines+':')
问题根因
- 原代码把每行的所有字段单独拆分后存入列表,判断逻辑仅跳过匹配的ID字段,没有整条删除对应ID的学生记录
- 写回文件时没有按原始行结构拼接,也没有添加换行符,导致所有内容挤在同一行,末尾还多了多余的冒号
- 没有做文件资源自动关闭处理,可能出现资源泄露
修正后代码
def remove_student(): target_id = input('enter your id:').strip() # 自动管理文件资源读取所有行 with open("lol.txt", "r", encoding="utf-8") as infile: lines = infile.readlines() # 筛选ID不匹配的有效行,保留原有结构 valid_lines = [] for line in lines: line = line.strip() if not line: continue # 取每行第一个字段作为学生ID判断 stu_id = line.split(':')[0] if stu_id != target_id: valid_lines.append(line + '\n') # 批量写回保留原始格式 with open("lol.txt", "w", encoding="utf-8") as write_file: write_file.writelines(valid_lines)
调整说明
- 按行判断首个ID字段,匹配则直接跳过整条记录,不会仅删除单个ID字段
- 保留原始冒号分隔结构,写回时补全换行符,不会出现内容挤在同一行的问题
- 使用
with语法自动管理文件资源,无需手动关闭文件避免泄露 - 增加空行兼容逻辑,适配文件存在空行的异常场景
- 输出完全匹配原始存储格式,不会产生多余的末尾冒号
内容的提问来源于stack exchange,提问作者stack overflow
相关产品推荐
相关产品推荐

