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

deleting a specific record from a binary file in 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()

如果要删除名称为<"some 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]