Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 18, 2016 20:43:22

nuzhnoff
Зарегистрирован: 2016-10-18
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по модулю shelve

Доброго времени форумчане! Начал изучать 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()
На функцию NameFull() прошу внимания не обращать, она работает корректно(при вводе пользователем ФИО создает словарь с раздельными ФИО)
Функция FindingId() подсчитывает количество ключей в shelve файле для задания следующего ключа, он же в будущем ID пользователя.
При опробовании кода модуль shelve создает файл и записывает первый контакт. Это все хорошо. Но вот когда я во второй раз пытаюсь вбить нового пользователя модуль shelve просто перезаписывает файл. Я пробовал менять ключ в ручную, все равно файл просто перезаписывается и если вывести print(db) то будет data_b. Я так полагаю, что решение мое проблемы заключается в добавлении нового словаря например data_b_1. Еще я предполагаю, что модуль shelve может добавлять новые данные только в уже имеющийся словарь, а при попытке добавления нового словаря shelve просто перезаписывает файл . Вообщем запутался. Вправьте мне мозги пожалуйста.

Отредактировано nuzhnoff (Окт. 18, 2016 20:44:03)

Офлайн

#2 Окт. 18, 2016 21:06:00

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Вопрос по модулю shelve

Фактически shelve работает как навороченный словарь…
Как Вы думаете, что будет если запустить такой код??

 #
test = {}
test["first"] = {1: 1, 2: 2}
test["first"] = {3: 3, 4: 4}

Офлайн

#3 Окт. 18, 2016 21:08:52

nuzhnoff
Зарегистрирован: 2016-10-18
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по модулю shelve

Просто перезапишутся данные. То есть получается все таки нового словаря мне не добавить?

Отредактировано nuzhnoff (Окт. 18, 2016 21:13:20)

Офлайн

#4 Окт. 18, 2016 21:36:27

Kudria
Зарегистрирован: 2016-10-02
Сообщения: 16
Репутация: +  1  -
Профиль   Отправить e-mail  

Вопрос по модулю shelve

 db[id_contact+1] = data_b

Офлайн

#5 Окт. 18, 2016 21:47:28

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

Вопрос по модулю shelve

Ты же будешь номер телефона по имени искать. По этому в качестве ключа нужно использовать in_name. Например:

 db = shelve.open('data_base','c')
db[in_name] = in_phone
db.close()
А вообще для телефонной книги я бы выбрал SqLite.



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

Офлайн

#6 Окт. 18, 2016 21:48:39

nuzhnoff
Зарегистрирован: 2016-10-18
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по модулю shelve

К сожалению сейчас под рукой нет питона, завтра посмотрю. Получается я просто перепутал, ключ shelve и словарь. Спасибо большое. В книге Лутца просто и ключ и словарь совпадали

Офлайн

#7 Окт. 18, 2016 21:50:55

nuzhnoff
Зарегистрирован: 2016-10-18
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по модулю shelve


Да SQLITE будет моим следующим шагом, так сказать модернизация программы.

Отредактировано nuzhnoff (Окт. 18, 2016 21:51:59)

Офлайн

#8 Окт. 18, 2016 21:51:51

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Вопрос по модулю shelve

Rodegast
А вообще для телефонной книги я бы выбрал SqLite.
+1
http://python-3.ru/page/sqlite-python-example

Офлайн

#9 Окт. 20, 2016 20:45:59

nuzhnoff
Зарегистрирован: 2016-10-18
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по модулю shelve

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'

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version