从python中的二进制文件中删除特定记录

问题描述

二进制文件中的每条记录都是这样存储的

import pickle
student={}
def add():
    
    n=int(input("enter number of entries"))
    for i in range(n):
        name=input("enter names")
        marks=eval(input("enter marks"))
        student[name]=marks
    f=open("sample.dat","wb")
    pickle.dump(student,f)
    f.close()

如果要删除name=如何操作

我试过这样但不正确

def delete():
    x=input("enter name to be deleted")
    for i in student:
        if x==i:
            del student[x]

        else:
            print("name not found")

解决方法

首先,一些改进

  1. 在您的代码中,当您迭代它时,您 del 一个 student 元素。 这是一个错误,在迭代字典时你不应该修改它的键。
    欲了解更多信息,请阅读:
    https://www.geeksforgeeks.org/python-delete-items-from-dictionary-while-iterating/
  2. 您根本不需要遍历字典。字典键是唯一的,因此检查 x 是否在字典中就足够了。你可以用 if x in students: 做到这一点。
  3. 不要明确关闭文件描述符。改用上下文管理器
    例如:https://cmdlinetips.com/2016/01/opening-a-file-in-python-using-with-statement/

对于其他一切,我不得不猜测,因为您的问题不够具体。


猜测您希望在调用 delete() 函数时文件内容发生变化。但是 delete() 函数不会写入任何文件,所以您可能忘记将新的 student 字典保存到文件中?

只是一个疯狂的猜测:

def delete():
    x=input("enter name to be deleted")
    if x in student:
        del student[x]
    else:
        print("name not found")

    with open("sample.dat","wb") as f:
        pickle.dump(student,f)
,

迭代时不能修改字典的内容。

你可以做的是迭代字典的键数组,如果匹配就从字典中删除项目。

即将删除功能更改为:

def delete():
x=input("enter name to be deleted")
for key in list(dict.keys(student)):
    if key==x:
        print('matched')
        del student[key]