Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 28, 2019 08:10:21

MortalZorchik
Зарегистрирован: 2019-09-28
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Адресная книга на Python

У меня есть проблема. В моём коде, когда добавляешь новый адрес(метод 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)

Отредактировано MortalZorchik (Окт. 1, 2019 12:29:00)

Офлайн

#2 Сен. 28, 2019 13:21:06

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

Адресная книга на Python

 Ab.addressBook = pickle.load(f)



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Онлайн

#3 Сен. 29, 2019 08:51:45

MortalZorchik
Зарегистрирован: 2019-09-28
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Адресная книга на Python

Rodegast
Не помогло
Может у меня вывод неправильный, не могу разобраться.

Офлайн

#4 Сен. 29, 2019 10:00:37

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Адресная книга на Python

Ошибок в выводе нет. Напишите все без класса. Функций он у вас все равно никаких не выполняет, а только вас запутывает.



Офлайн

#5 Сен. 30, 2019 10:13:30

MortalZorchik
Зарегистрирован: 2019-09-28
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Адресная книга на Python

doza_and
Ошибок в выводе нет. Напишите все без класса. Функций он у вас все равно никаких не выполняет, а только вас запутывает.
Дело в том, что я учил python по книге ‘A Byte Of Python’ и там была задача:
Создайте собственную программу “Адресная книга”, работающую из командной строки и позволяющую просматривать, добавлять, изменять, удалять или искать контактные данные ваших знакомых. Кроме того, эта информация также должна сохраняться на диске для последующего доступа.
А также была подсказка:
Создайте класс для хранения персональных данных. Объекты визитных карточек храните в словаре, в котором имена контактов будут служить ключами. Для длительного хранения этих объектов на жёстком диске воспользуйтесь модулем pickle. Для добавления, изменения или удаления контактов применяйте встроенные методы словаря.

Вот я и делал по подсказке, но у меня не сохраняется на жёстком диске объекты.

Офлайн

#6 Сен. 30, 2019 20:04:04

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Адресная книга на Python

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("Адрес удалён")

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

Поэтому я думаю вам рано пользоваться классами. Напишите с функциями.



Офлайн

#7 Окт. 1, 2019 12:35:01

MortalZorchik
Зарегистрирован: 2019-09-28
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Адресная книга на Python

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

Прикреплённый файлы:
attachment screenshot_5.png (29,3 KБ)

Офлайн

#8 Окт. 1, 2019 20:59:52

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Адресная книга на Python

MortalZorchik
потому что при повторном вызове значение добавленное в addressBook с помощью метода Ab.add()

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


Ошибка в любом из этих действий приведет к неправильному функционированию кода. Думаю вы не локализовали причину ошибки поэтому делаете неточные выводы. Почему вы думаете что не работает этап 3?



Отредактировано doza_and (Окт. 1, 2019 21:01:59)

Офлайн

#9 Окт. 2, 2019 13:02:31

MortalZorchik
Зарегистрирован: 2019-09-28
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Адресная книга на Python

doza_and
А что по вашему мнению у меня не работает? Я считаю что именно 3 пункт не работает потому что по скриншоту видно что при вводе нового адреса и выводе опять этой переменной(addressBook) предыдущее имя исчезает(то есть не сохраняется).

Офлайн

#10 Окт. 2, 2019 15:57:06

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Адресная книга на Python

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) # вывод словаря в консоль и выход из программы
а теперь покажите где вы его сохраняете после внесения изменений? А где вы загружаете вашу книгу при старте программы? Я лично такого не нашел.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Окт. 2, 2019 16:05:35)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version