Форум сайта python.su
0
Доброго времени форумчане! Начал изучать Python и первое мое задание (я сам себе учитель) это написать консольное приложение - Телефонная книга. В качестве ‘базы данных’ выбрал словарь в словаре который будет обрабатываться модулем shelve( идея пошла из книги - Марк Лутц Программирование на Python). Цели: работа с файлами(основа).
Есть код который должен записывать данные в файл, вот он:
from conversion_name import NameFull from finding_id import FindingId import shelve id_contact = FindingId() data_b = {} in_name = NameFull(input("Введите ФИО контакта: ")) in_phone = input("Введите номер телефона: ") data_b['name'] = in_name data_b['phone'] = in_phone print(data_b) db = shelve.open('data_base','c') db['data_b'] = id_contact+1 db.update() db.close()
Отредактировано nuzhnoff (Окт. 18, 2016 20:44:03)
Офлайн
49
Фактически shelve работает как навороченный словарь…
Как Вы думаете, что будет если запустить такой код??
# test = {} test["first"] = {1: 1, 2: 2} test["first"] = {3: 3, 4: 4}
Офлайн
0
Просто перезапишутся данные. То есть получается все таки нового словаря мне не добавить?
Отредактировано nuzhnoff (Окт. 18, 2016 21:13:20)
Офлайн
1
db[id_contact+1] = data_b
Офлайн
186
Ты же будешь номер телефона по имени искать. По этому в качестве ключа нужно использовать in_name. Например:
db = shelve.open('data_base','c') db[in_name] = in_phone db.close()
Офлайн
0
К сожалению сейчас под рукой нет питона, завтра посмотрю. Получается я просто перепутал, ключ shelve и словарь. Спасибо большое. В книге Лутца просто и ключ и словарь совпадали



Офлайн
0
Да SQLITE будет моим следующим шагом, так сказать модернизация программы.
Отредактировано nuzhnoff (Окт. 18, 2016 21:51:59)
Офлайн
Rodegast+1
А вообще для телефонной книги я бы выбрал SqLite.
Офлайн
0
KudriaХочется отметить, что если сделать так
db[id_contact+1] = data_b
Traceback (most recent call last):
File "D:\OneDrive\Python\практика\address book v1.0\add_contact.py", line 13, in <module>
db[a] = 'data_b'
File "C:\Users\Nuzhnoff\AppData\Local\Programs\Python\Python35-32\lib\shelve.py", line 125, in __setitem__
self.dict[key.encode(self.keyencoding)] = f.getvalue()
AttributeError: 'int' object has no attribute 'encode'
Офлайн