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

如何使用pickle编写函数删除二进制文件中指定ID的学生记录

学生信息管理删除功能实现方案

核心实现逻辑

二进制 pickle 序列化文件不支持局部删除操作,因此需要遵循「全量读取→过滤无效记录→覆盖重写」的实现思路:

  • 先以只读模式打开文件,读取全部学生记录存入临时列表
  • 过滤掉列表中 ID 与待删除 ID 匹配的记录
  • 清空原文件,将过滤后的有效记录重新序列化写入原文件
  • 额外补充文件不存在、无匹配 ID 等边界场景的异常处理

修正后的完整可运行代码

# 学生信息管理:追加、展示、删除功能实现
import pickle
import os

def append():
    f = open("student.bin","ab")
    x = int(input("请输入要追加的学生数量: "))
    for i in range(x):
        y = eval(input("请按照[id, 姓名, 百分比]的格式输入学生信息: "))
        pickle.dump(y,f)
    f.close()
    print("追加完成")

def display():
    if not os.path.exists("student.bin"):
        print("暂无学生记录")
        return
    f = open("student.bin","rb")
    print("当前所有学生记录:")
    while True:
        try:
            x = pickle.load(f)
            print(f"id:{x[0]} 姓名:{x[1]} 百分比:{x[2]}")
        except EOFError:
            break
    f.close()

def delete():
    if not os.path.exists("student.bin"):
        print("暂无学生记录,无需删除")
        return
    # 第一步:读取全部学生记录
    all_students = []
    f = open("student.bin","rb")
    while True:
        try:
            stu = pickle.load(f)
            all_students.append(stu)
        except EOFError:
            break
    f.close()

    del_id = input("请输入要删除的学生id: ")
    # 第二步:过滤待删除记录
    new_students = [stu for stu in all_students if str(stu[0]) != str(del_id)]
    
    if len(new_students) == len(all_students):
        print(f"未找到id为{del_id}的学生记录")
        return
    # 第三步:覆盖重写原文件
    f = open("student.bin","wb")
    for stu in new_students:
        pickle.dump(stu, f)
    f.close()
    print(f"已成功删除id为{del_id}的学生记录")

# 菜单驱动主程序
if __name__ == "__main__":
    while True:
        print("\n===== 学生信息管理菜单 =====")
        print("1. 追加学生记录")
        print("2. 展示所有学生记录")
        print("3. 按id删除学生记录")
        print("4. 退出程序")
        choice = input("请输入操作编号: ")
        if choice == '1':
            append()
        elif choice == '2':
            display()
        elif choice == '3':
            delete()
        elif choice == '4':
            print("程序退出")
            break
        else:
            print("输入无效,请重新输入")

注意事项

  • 当前代码使用eval接收输入存在安全风险,正式使用建议改为分别接收 id、姓名、百分比三个参数后手动组装列表
  • 生产环境操作文件建议使用with语法自动管理文件句柄,避免忘记 close 导致的资源占用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:48:02