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

从文本文件删除指定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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:15:01