如何使用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
相关产品推荐
相关产品推荐

