Найти - Пользователи
Полная версия: Вопрос по модулю shelve
Начало » Python для новичков » Вопрос по модулю shelve
1
nuzhnoff
Доброго времени форумчане! Начал изучать 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 просто перезаписывает файл . Вообщем запутался. Вправьте мне мозги пожалуйста.
4kpt_IV
Фактически shelve работает как навороченный словарь…
Как Вы думаете, что будет если запустить такой код??

 #
test = {}
test["first"] = {1: 1, 2: 2}
test["first"] = {3: 3, 4: 4}
nuzhnoff
Просто перезапишутся данные. То есть получается все таки нового словаря мне не добавить?
Kudria
 db[id_contact+1] = data_b
Rodegast
Ты же будешь номер телефона по имени искать. По этому в качестве ключа нужно использовать in_name. Например:
 db = shelve.open('data_base','c')
db[in_name] = in_phone
db.close()
А вообще для телефонной книги я бы выбрал SqLite.
nuzhnoff
К сожалению сейчас под рукой нет питона, завтра посмотрю. Получается я просто перепутал, ключ shelve и словарь. Спасибо большое. В книге Лутца просто и ключ и словарь совпадали
nuzhnoff

Да SQLITE будет моим следующим шагом, так сказать модернизация программы.
vic57
Rodegast
А вообще для телефонной книги я бы выбрал SqLite.
+1
http://python-3.ru/page/sqlite-python-example
nuzhnoff
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'
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