Найти - Пользователи
Полная версия: Адресная книга на Python
Начало » Центр помощи » Адресная книга на Python
1 2
MortalZorchik
У меня есть проблема. В моём коде, когда добавляешь новый адрес(метод add()), он не сохраняется.
Что мне надо сделать с моим кодом что бы он сохранял в словарь новый адрес?
 import pickle
addressBook = {}
class Ab:
    
    def save():
        with open('addressBook.pickle', 'wb') as f:
            pickle.dump(addressBook, f)
            
    
    def load():
        with open('addressBook.pickle', 'rb') as f:
            addressBook = pickle.load(f)
            
    
    def add():
        name = input("Введите имя:")
        address = input("Введите адрес:")
        addressBook[name] = address
        print("Адрес добавлен")
      
    def delete():
        name = input("Введите имя, данные которого хотите удалить")
        del addressBook[name]
        print("Адрес удалён")
        
    def printAb():
        for name, address in addressBook.items():
            print("Адрес {0}: {1}".format(name, address))
        
    def change():
        name = input("Введите имя, чей адрес вы хотите изменить:")
        address = input("Введите новый адрес")
        addresslist[name] = address
        
        
    def find():
        name = input("Введите имя, чей адрес вы хотите узнать")
        print(addressBook[name])
        
a = Ab
num = int(input("Что вы хотите сделать? 1-Добавить новый адрес. 2-Удалить существующий адрес. 3-Вывести все адреса в адреской книге. 4-Изменить существующий адрес. 5-Найти определённый адрес из книги: "))
a.save()
if num == 1:
    a.add()
    
elif num == 2:
    a.delete()
elif num == 3:
    a.printAb()
elif num == 4:
    a.change()
elif num == 5:
    a.find()
else:
    print("Введите 1 из указанных цифр")
    
print(addressBook)
Rodegast
 Ab.addressBook = pickle.load(f)
MortalZorchik
Rodegast
Не помогло
Может у меня вывод неправильный, не могу разобраться.
doza_and
Ошибок в выводе нет. Напишите все без класса. Функций он у вас все равно никаких не выполняет, а только вас запутывает.
MortalZorchik
doza_and
Ошибок в выводе нет. Напишите все без класса. Функций он у вас все равно никаких не выполняет, а только вас запутывает.
Дело в том, что я учил python по книге ‘A Byte Of Python’ и там была задача:
Создайте собственную программу “Адресная книга”, работающую из командной строки и позволяющую просматривать, добавлять, изменять, удалять или искать контактные данные ваших знакомых. Кроме того, эта информация также должна сохраняться на диске для последующего доступа.
А также была подсказка:
Создайте класс для хранения персональных данных. Объекты визитных карточек храните в словаре, в котором имена контактов будут служить ключами. Для длительного хранения этих объектов на жёстком диске воспользуйтесь модулем pickle. Для добавления, изменения или удаления контактов применяйте встроенные методы словаря.

Вот я и делал по подсказке, но у меня не сохраняется на жёстком диске объекты.
doza_and
MortalZorchik
но у меня не сохраняется на жёстком диске объекты.
Программирование требует четкости включения логики в голове.

Почему вы решили что они не сохраняются? Я думаю как раз это работает.

А четкость.
       with open('addressBook.pickle', 'wb') as f:
            pickle.dump(Ab.addressBook, f)          # ок хотя это глупость использовать объект в классе Ab.addressBook
 def load():
        with open('addressBook.pickle', 'rb') as f:
            addressBook = pickle.load(f) # с какой радости addressBook теперь без Ab?
   def delete():
        name = input("Введите имя, данные которого хотите удалить")
        del Ab.addresslist[name]  # Откуда тут addresslist??? Вы забыли как назвали объект?
        print("Адрес удалён")

Я не вижу логики в ваших действиях. Вы можете написать напротив комментариев какими соображениями пользовались когда это писали?

Поэтому я думаю вам рано пользоваться классами. Напишите с функциями.
MortalZorchik
doza_and
Я исправил код. С чего я взял то что файл не сохраняется, потому что при повторном вызове значение добавленное в addressBook с помощью метода Ab.add() не сохраняется(См. скриншот).
doza_and
MortalZorchik
потому что при повторном вызове значение добавленное в addressBook с помощью метода Ab.add()

Думаю ваши выводы поспешны или неточны.
Вы проверили что не работает цепочка
1 Ввод с консоли команды и аргументов
2 вывод на консоль содержимого
3 сохранение на диск нового элемента
4 Ввод с консоли команды и аргументов
5 чтение данных
6 вывод на консоль содержимого


Ошибка в любом из этих действий приведет к неправильному функционированию кода. Думаю вы не локализовали причину ошибки поэтому делаете неточные выводы. Почему вы думаете что не работает этап 3?
MortalZorchik
doza_and
А что по вашему мнению у меня не работает? Я считаю что именно 3 пункт не работает потому что по скриншоту видно что при вводе нового адреса и выводе опять этой переменной(addressBook) предыдущее имя исчезает(то есть не сохраняется).
PEHDOM
MortalZorchik
Я считаю что именно 3 пункт не работает потому что по скриншоту видно что при вводе нового адреса и выводе опять этой переменной(addressBook) предыдущее имя исчезает(то есть не сохраняется).
мда, все смешалось люди, кони….
а с чего оно должно сохраняться? давайте рассмотрим пошагово ваш код:
 import pickle
addressBook = {} # создаетм пустой словарь
class Ab: # тут пока неважно что внутри
 ....
a = Ab # хмм связываем  класс "Ab" с переменной "а", зачем? вы не знаете как работать с классами? может вам какую книжку почитать или туториал?
num = int(input("Что вы хотите сделать? 1-Добавить новый адрес. 2-Удалить существующий адрес. 3-Вывести все адреса в адреской книге. 4-Изменить существующий адрес. 5-Найти определённый адрес из книги: "))
a.save() # сохраняем пустой словарь на диск
if num == 1:
    a.add() # если 1 добавляем запись в словарь
elif num == 2:
    a.delete() # если 2 удаляем запись из словаря
elif num == 3:
    a.printAb() # если 3 выаодим содержание словаря
elif num == 4:
    a.change() # если 4 то по сути ничем не отличаеться от 1
elif num == 5:
    a.find() # если 5 то выводим адрес
else:
    print("Введите 1 из указанных цифр") # защита от дурака
print(addressBook) # вывод словаря в консоль и выход из программы
а теперь покажите где вы его сохраняете после внесения изменений? А где вы загружаете вашу книгу при старте программы? Я лично такого не нашел.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB