Проблемы с травлением в 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)