Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 9

Модуль Shelve не сохраняет данные

30.01.2021, 21:04. Показов 2251. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Начал недавно изучать Python, прошел книгу "Кусок Питона"(A Byte of Python), а в конце задание:
"Создайте собственную программу «Адресная книга», работающую из командной строки и позволя-
ющую просматривать, добавлять, изменять, удалять или искать контактные данные ваших знакомых.
Кроме того, эта информация также должна сохраняться на диске для последующего доступа."

Вначале решил попробовать сделать без ООП, но встал вначале на моменте добавления и последующего
просмотра контактов:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import shelve, time
data = {}
filename = 'data'
while True:
    print("""
[0] Просмотреть список контактов 
[1] Добавить новый контакт
[2] Выход""")
    n = int(input('Выберете действие: '))
    if n == 0:
        """Просмотр списков"""
        count = 0
        with shelve.open(filename) as f:
            for key in f:
                print(key, " - ", f[key])
                count +=1
            print("Всего ", count, " номеров")
 
    if n == 1:
        """Добавить"""
        name = str(input("Введите имя: "))
        address = str(input("Введите адрес: "))
        data[name] = address
        print(name, " - ", data[name])
        with shelve.open(filename) as f:
            for key in f: f[key] = data[key]
 
    if n == 2 :
        print('До свидания')
        time.sleep(2)
        break

Вывод такой:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[0] Просмотреть список контактов 
[1] Добавить новый контакт
[2] Выход
Выберете действие: 0
Всего  0  номеров
 
[0] Просмотреть список контактов 
[1] Добавить новый контакт
[2] Выход
Выберете действие: 1
Введите имя: Вася
Введите адрес: ул.Новая, д.15
Вася  -  ул.Новая, д.15
 
[0] Просмотреть список контактов 
[1] Добавить новый контакт
[2] Выход
Выберете действие: 0
Всего  0  номеров
 
[0] Просмотреть список контактов 
[1] Добавить новый контакт
[2] Выход
Выберете действие:
Почему не сохраняются контакты или не выводятся?
Если можно - объясните подробно и помогите советами, очень хочу понимать работу процесса.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.01.2021, 21:04
Ответы с готовыми решениями:

Shelve не обновляет данные
Доброе время суток. Есть два модуля, модуль А создает объект shelve и хранит там данные. db = shelve.open('database') db =...

Не сохраняет данные в БД
Добрый день, не могу второй день решить проблему. При попытки добавить новую запись в БД, она появляется в ДатагридФью, но в БД так и не...

не сохраняет данные в БД
Здравствуйте. Сталкнулся с такой проблемой. Внутри тега form находится несколько ячеек. После заполнения все они сохраняются в БД кроме тех...

7
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.01.2021, 21:11
Цитата Сообщение от loonyhuman Посмотреть сообщение
for key in f
Как по-твоему - пустой цикл будет выполняться?
0
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 9
30.01.2021, 21:17  [ТС]
Garry Galler, а как тогда должна выглядеть конструкция, чтобы сохраняла данные? (Хоть убейте - додумать не могу)
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.01.2021, 21:17
Python
1
f[key] = value
0
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 9
31.01.2021, 06:32  [ТС]
Garry Galler, это мало что мне дает для понимания. Можете расписать построчно с комментариями?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
31.01.2021, 15:23
Цитата Сообщение от loonyhuman Посмотреть сообщение
это мало что мне дает для понимания.
Блин, новички, вы документацию вообще не читаете?
Ну просто примеры гуглите:

Python
1
2
3
4
5
6
7
8
9
10
11
12
import shelve
 
FILENAME = "states2"
with shelve.open(FILENAME) as states:
    states["London"] = "Great Britain"
    states["Paris"] = "France"
    states["Berlin"] = "Germany"
    states["Madrid"] = "Spain"
 
with shelve.open(FILENAME) as states:
    print(states["London"])
    print(states["Madrid"])
В каком месте этого кода есть цикл? Вообще зачем он?
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
31.01.2021, 16:29
Лучший ответ Сообщение было отмечено loonyhuman как решение

Решение

Строка 26.
Цитата Сообщение от loonyhuman Посмотреть сообщение
for key in f: f[key] = data[key]
Здесь две ошибки.
1) for key in f будет работать, только если у Вас уже есть запись в файле с ключем key. И это значит что данная строка может только изменять существующую запись, но не может добавлять новую. О чем и сказал Вам Garry Galler.
2) И поэтому создаваемой записи с новым ключом должно присваиваться некоторое значение, например name .
Да у Вас здесь вообще сплошная путаница.
Вы со словарем не умеете работать.
Python
1
2
3
        name = str(input("Введите имя: "))
        address = str(input("Введите адрес: "))
        data[name] = address
Вы здесь в словаре получаете:
{'Иванов' : 'г.Москва. ул. Чертановская д. 16'}
Хотя нужно получить словарь:
{'name' : 'Иванов', 'address' : 'г.Москва. ул. Чертановская д. 16'}
Пример аналогичный Вашему подробно разбирается у Лутца в книге
Лутц М. Программирование на Python. Том 1 (4-е издание, 2011) Гл. 1 "Предварительный обзор".
Там как Вам и нужно список сохраняется с помощью модуля shelve.

Добавлено через 21 минуту
loonyhuman, Когда Вы создаете список, то в реальности список создается в виде таблицы с именами столбцов (полей) или они подразумеваются.

Python
1
2
3
4
5
name        address
 
Иванов     г. Москва
Петров     г. Тула
Бузова     с. Придурки
Словарь должен моделировать реальный список, тем более что столбцов (полей) обычно бывает больше двух.
1
0 / 0 / 0
Регистрация: 03.12.2017
Сообщений: 9
31.01.2021, 16:51  [ТС]
Viktorrus, вот теперь понял, спасибо большое!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.01.2021, 16:51
Помогаю со студенческими работами здесь

Не сохраняет данные
Всем доброго вечера! Работаю с базой FireBird 2.1, которая лежит на сервере. По моей идеи программой где база используется, можно...

Приложение не сохраняет данные
Добрый день хочу спросить, почему у меня не происходит сохранение данных в приложении, все перепробовал не получается. Вот код : ...

BindingSource не сохраняет данные
В общем, супер знатоки, помогите пожалуйста, 2й день мучаюсь) База данных, созданная в ms sql server 2012 подключается в BindingSource и...

Скрипт не сохраняет данные в бд.
Здравствуйте. Пытаюсь заставить работать скрипт-хостинг картинок. Пока на локалхост. Скрипт называется Wussa. Использую Denwer. Указал путь...

Неправильно сохраняет данные
Не могу понять в чем проблема. Каждый раз при вводе новых данных, изменяются старые. Вот код: #include <conio.h> #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru