Проблемы с травлением в python - элементы не сохраняются в файл после выхода из программы

Я пытаюсь создать программу на Python, чтобы сохранить дни рождения моих друзей и легко получить к ним доступ, проверять дни рождения каждый день (я не очень хорошо запоминаю даты и никогда не пользуюсь Facebook), но когда я добавляю новый день рождения, он становится доступным только пока я не закончу программу - она ​​снова исчезнет. Я боролся с этим некоторое время и буду очень признателен за помощь в исправлении ошибки. Спасибо!

import time
import pickle
def main():
        birthday_file = open('birthdays_dict.dat','ab')
        birthday_doc = open('birthdays_dict.dat','rb')
        birthdays = pickle.load(birthday_doc)
        date = time.strftime("%m/%d")
        again = 'y'
        while again.lower() == 'y' or again.lower() == 'yes':
                choice = menu_choice()
                if choice == 1:
                        name = add_name()
                        birthday = add_birthday()
                        birthdays[name] = birthday
                        print(name)
                        print(birthday)
                        pickle.dump(birthdays,birthday_file)
                elif choice == 2:
                        print('Birthdays today(' + date + '):')
                        birth_today = {}
                        for key, value in birthdays.items():
                                if value == date:
                                        print(key)
                elif choice == 3:
                        search_name = input('Enter name to search: ')
                        print()
                        if search_name in birthdays:
                                print(birthdays[search_name])
                                if birthdays[search_name] == date:
                                        print('Their birthday is today!')
                        else:
                                print('Not found')
                else:
                        print('Not a valid selection!')
                print()
                again = go_again()
        birthday_file.close()
        birthday_doc.close()

1 ответ

Решение

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


Чтобы это исправить, вам нужно изменить это:

birthday_file = open('birthdays_dict.dat','ab')

… к этому:

birthday_file = open('birthdays_dict.dat','wb')

Но не делайте этого изменения самостоятельно, потому что это сотрет файл, прежде чем вы прочитаете старую версию!


Вы, вероятно, хотите сделать что-то вроде этого в верхней части функции:

with open('birthdays_dict.dat', 'rb') as birthday_doc:
    birthdays = pickle.load(birthday_doc)

Я использовал with заявление, чтобы файл автоматически закрывался сразу после loadтак что мы можем перезаписать его позже.

Затем, когда вы захотите записать файл, вы откроете его в w режим, чтобы стереть файл и перезаписать его новой версией - в этот момент вы могли бы также немедленно закрыть его, потому что, если вы когда-нибудь сделаете запись в него снова, вы захотите сначала стереть его снова, поэтому давайте использовать with снова:

with open('birthdays_dict.dat', 'wb') as birthday_doc:
    pickle.dump(birthdays, birthday_doc)
Другие вопросы по тегам