Как открыть файл Python pickle, добавить к нему, сохранить и закрыть его? - PullRequest
1 голос
/ 16 февраля 2020

Вот мой код:

 import pickle


 class User:
     def __init__(self, username, password):
         self.username = username
         self.password = password

     def set_password(self):
         self.password = input("Enter NEW password > ")

     def __get_password(self):
         return self.password

     def __get_username(self):
         return self.username

     def change_password(self):
         my_password = input("Enter your CURRENT password > ")
         if my_password == User.__get_password(self):
             self.set_password()
         else:
             print("Please try again")

     def display_details(self):
         print()
         print("Username and password")
         print("---------------------")
         print("username is: ", User.__get_username(self))
         print("password is: ", User.__get_password(self))
         print()

     def __repr__(self):
         return f'username: {self.username}'


 users = [User("MichaelPalin", "P4rr0t"), User("EricIdle", "M0nty"), User("TerryJones", "Pyth0n")]

 try:
     foo = pickle.load(open("users.pickle", "rb"))
 except (OSError, IOError) as f:
     foo = 3
     pickle.dump(foo, open("users.pickle", "wb"))

 # with open('users.pickle', 'wb') as f:
 #     pickle.dump(users, f)


 def find_user(name):
     for user in users:
         if user.username == name:
             return user


 def add_user():
     user = input("Enter NEW user > ")
     password = input(f"Enter password for {user} > ")
     users.append(User(user, password))


 def delete_user():
     delete_user = input("Enter the user you wish to remove > ")
     user = find_user(delete_user)
     if user:
         users.remove(user)
         print('done')
     else:
         print(f'user {delete_user} not found')


 def change_password():
     my_password = input("Enter your CURRENT password > ")
     change_password()


 def display_users():
     for user in users:
         print(user)


 def invalid_entry():  # Response for invalid entries to menu.
     print("Invalid entry, please try again")
     print()


 def menu():  # Display menu, prompt for and accept keyboard choice
     print("Please select one of the following:")
     print()
     print("Enter a if you want to add a new user")
     print("Enter d if you want to delete a user")
     print("Enter f if you want to find a user")
     print("Enter c if you want to change your password")
     print("Enter u if you want to display a list of users")
     print("Enter q if you want to Quit")
     choice = input("")
     return choice


 while True:
     menu_choice = menu()
     if menu_choice.lower() == "a":
         add_user()
     elif menu_choice.lower() == "d":
         delete_user()
     elif menu_choice.lower() == "f":
         find_user()
     elif menu_choice.lower() == "c":
         change_password()
     elif menu_choice.lower() == 'u':
         display_users()
     elif menu_choice.lower() == "q":
         print("Goodbye")
         with open('users.pickle', 'wb') as f:
             pickle.dump(users, f)
             quit()
     else:
         invalid_entry()

Хотя он не работает должным образом, так как файл pickle перезаписывается при каждом запуске программы. Я предполагаю, что виновником является линия users, но я не знаю, как решить проблему, если это так. Я попытался переместить всю строку в конец раздела try, выровненного по строке pickle.dump, но это просто выдало ошибку:

NameError: имя 'users' не определено

Может кто-нибудь помочь мне, пожалуйста? Я пытаюсь сделать это около 2 недель, и я все больше расстраиваюсь. Я просмотрел так много связанных учебников в Интернете, что многие ссылки, которые я вижу, теперь фиолетовые, но я просто не могу понять, как написать код для создания правильного логического потока.

Я думаю, логика c, вероятно, должна быть:

1) Существует ли файл?
Если Y - ничего не делать
Если N - создать его с образцами данных

2) Желает ли пользователь создать новый логин?
Если Y - добавить логин к файлу
Если N - ничего не делать

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Проблема, которую я обнаружил, заключается в том, что вы на самом деле не используете загруженные данные рассола в следующих строках:

users = [User("MichaelPalin", "P4rr0t"), User("EricIdle", "M0nty"), User("TerryJones", "Pyth0n")]

 try:
     foo = pickle.load(open("users.pickle", "rb"))
 except (OSError, IOError) as f:
     foo = 3
     pickle.dump(foo, open("users.pickle", "wb"))

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

 try:
     users = pickle.load(open("users.pickle", "rb"))
 except (OSError, IOError) as f:
     users = [User("MichaelPalin", "P4rr0t"), User("EricIdle", "M0nty"), User("TerryJones", "Pyth0n")]
     pickle.dump(foo, open("users.pickle", "wb"))

Теперь вы попытаетесь загрузить готовый файл, и в случае неудачи сгенерировать значение по умолчанию

0 голосов
/ 16 февраля 2020

попробуйте этот код:

try:
    users = pickle.load(open("users.pickle", "rb"))
except (OSError, IOError) as f:
    foo = 3
    print("except")
    pickle.dump(users, open("users.pickle", "wb"))

также quit() снаружи с:

with open('users.pickle', 'wb') as f:
    pickle.dump(users, f)
quit()
...