首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用Python删除存储在Pickle文件中的对象

如何使用Python删除存储在Pickle文件中的对象
EN

Stack Overflow用户
提问于 2018-06-04 05:11:54
回答 1查看 5.5K关注 0票数 0

我正在开发一个数据库程序,它将对象存储在一个pickle文件中。这些对象有三个属性:名称、等级和平均值。我已经能够将每个学生对象保存到一个pickle文件中,并且我可以读回该文件并显示其内容。但是,我不知道如何使用索引号从文件中删除对象。我希望用户能够键入一个数字,然后删除该编号的对象(因此,如果我键入2,则第二个对象将被删除。)现在,我的代码能够从pickle列表中删除一个项目,但是我不能让它与一个对象一起工作。当我尝试删除一个学生时,我得到了以下错误: TypeError:' student‘对象不支持项目删除。有人知道如何从我的pickle文件中删除对象吗?

我的代码如下:

代码语言:javascript
复制
import pickle

class Student():
    def __init__(self,nam,grd,avg):
        self.name = nam
        self.grade = grd
        self.average = avg

    def get_details(self):
        print(self.name, self.grade, self.average)

    def create_item():
        new_student = Student(input("Enter name: "),input("Enter grade: "), input("Enter average: "))
        save_object(new_student, 'student_data.pkl')

    def clear_database():
        file = open('student_data.pkl', 'w')
        file.close()

def save_object(obj, filename):
    with open(filename, 'ab') as output:
        pickle.dump(obj, output, pickle.HIGHEST_PROTOCOL)

def unpickle_database(filename):
    with open(filename, 'rb') as f:
        while True:
            try:
                yield pickle.load(f)
            except EOFError:
                break

def display_database():
    print("\nName:               Grade:              Average:            ")
    for student in unpickle_database('student_data.pkl'):
        property_list = [student.name, student.grade, student.average]
        print(''.join([v.ljust(20,' ') for v in property_list]))

def delete_student(student_to_delete):
    with open('student_data.pkl', 'rb') as f:
        db = pickle.load(f)
    try:
        del db[student_to_delete]
    except KeyError:
        print("{user} doesn't exist in db".format(user=user_to_delete))

while True:
    user_input = input("\nType \"Clear\" to clear the database. Type \"Add\" to add a student. Type \"Display\" to display the database contents. Type \"Quit\" to quit the program. Type \"Remove\" to remove a student.\n")
    if user_input == "Quit":
        break
    if user_input == "Clear":
        Student.clear_database()
        print("\nThe database has been cleared.")
    elif user_input == "Add":
        Student.create_item()
        display_database()
    elif user_input == "Display":
        display_database()
    elif user_input == "Remove":
        student_to_delete = input("Type the student number that you would like to delete: ")
        delete_student(student_to_delete)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-04 05:18:18

不能直接从Pickle文件中删除对象。我的意思是,你可以这样做,但它需要你解析它的结构,以确定各个对象的数据开始和结束的位置。这很单调乏味,也不是很有价值。

不过,您可以做的是将所有被腌制的学生作为一个列表读取:

代码语言:javascript
复制
students = list(unpickle_database(filename))

然后,使用del students[index]从列表中删除一个学生,最后使用该列表重新挑选所有剩余的学生:

代码语言:javascript
复制
for student in students:
    save_object(student, filename)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50671010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档