Как удалить объект, сохраненный в файле Pickle с помощью Python - PullRequest
0 голосов
/ 04 июня 2018

Я работаю над программой базы данных, которая хранит объекты в файле рассола.У объектов есть три атрибута: Имя, Оценка и Среднее.Мне удалось сохранить каждый объект Student в файл pickle, и я могу прочитать файл обратно и отобразить его содержимое.Однако я не могу понять, как удалить объект из файла, используя индексный номер.Я хочу, чтобы пользователь мог набрать номер, а затем удалить этот пронумерованный объект (поэтому, если я введу цифру 2, второй объект будет удален). Сейчас мой код может удалить элемент из списка маринадов, ноЯ не могу заставить его работать с объектом.Когда я пытаюсь удалить студента, я получаю следующую ошибку: Ошибка типа: объект «Студент» не поддерживает удаление элемента.Кто-нибудь знает, как я могу удалить объект из файла маринования?

Мой код указан ниже:

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)

1 Ответ

0 голосов
/ 04 июня 2018

Вы не можете удалять объекты напрямую из файла Pickle.Я имею в виду, что вы могли бы сделать это, но это потребовало бы, чтобы вы проанализировали его структуру, чтобы определить, где данные отдельных объектов начинаются и заканчиваются.Это утомительно и не очень полезно.

Что вы можете сделать, так это прочитать всех маринованных студентов в виде списка:

students = list(unpickle_database(filename))

Затем удалите одного из студентов из списка с помощью del students[index] и, наконец, переизберите всех оставшихся студентов, используя указанный список:

for student in students:
    save_object(student, filename)
...