6 / 6 / 2
Регистрация: 04.02.2017
Сообщений: 168

Модуль pickle

05.02.2020, 18:41. Показов 1621. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Код адресной книги. Все четко работало. Скопировал код и начал проводить манипуляции. Когда запустил копию измененного кода,то перестал запускаться основной код). Удалил все созданные файлы .dat так как возможно произошла перезапись,но код все равно не запускается и выдает ошибку: file = open('gip.data', 'rb')
FileNotFoundError: [Errno 2] No such file or directory: 'gip.data'

Как в этом коде использовать модуль shelve и в чем разница?
Код:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import pickle
 
 
class Address:
    my_dict = dict()
 
    def __init__(self, key, value):
        self.key = key
        self.value = value
 
        Address.my_dict = dict()
 
    def __setitem__(self, key, value):
        self.key = input('Введите имя: ')
        self.value = input('Введите адрес: ')
        Address.my_dict[self.key] = self.value
        if self.key in Address.my_dict:
            print('\nАдрес:', Address.my_dict)
 
    def __delitem__(self, key):
        self.key = input('Введите имя для удаления: ')
        del Address.my_dict[self.key]
        print('\nВ адресной книге: {0} контактов\n'.format(len(Address.my_dict)))
        for name, address in Address.my_dict.items():
            print('\nКонтакт: {0}, с адресом {1}.'.format(name, address))
 
    def change(self):
        self.key = input('Введите имя которое нужно изменить: ')
        del Address.my_dict[self.key]
 
        self.key = input('Введите новое имя: ')
        self.value = input('Введите новый адрес: ')
        Address.my_dict[self.key] = self.value
        if self.key in Address.my_dict:
            print('\nАдрес:', Address.my_dict)
 
    def find(self):
        self.key = input('Введите имя для поиска: ')
        if self.key in Address.my_dict:
            print('Адрес: ', Address.my_dict[self.key])
 
        else:
            print('Такого имени не найдено.')
 
    @staticmethod
    def loading():
        file = open('gip.data', 'rb')
        Address.my_dict = pickle.load(file)  # Помещаем объект в файл.
        file.close()
 
    @staticmethod
    def store():
        file = open('gip.data', 'wb')
        pickle.dump(Address.my_dict, file)  # Помещаем объект в файл.
        file.close()
 
 
r = Address('', '')
Address.loading()
running = True
while running:
    search = int(input('Введите - 1-Добавить контакт; 2-Удалить контакт;3-Изменить контакт; 4-Найти контакт;\
 Для выхода их программы введите 5-Выход: '))
    if search == 1:
        r.__setitem__('', '')
        if len(Address.my_dict) == 100:
            print('Адресная книга переполнена, удалите 1 из контактов')
            r.__delitem__('')
 
    if search == 2:
        r.__delitem__('')
        Address.store()
 
    if search == 3:
        r.change()
        Address.store()
 
    if search == 4:
        r.find()
 
    if search == 5:
        Address.store()
        running = False
 
    if len(Address.my_dict) == 0:
        running = False
Добавлено через 15 минут
Исправил данную ошибку методом исключения). Меня интересует,почему ошибка имеет место быть. Что ни так с директорией и почему код запускался изначально.
Код:
Python
1
2
3
4
5
6
7
8
@staticmethod
    def loading():
        try:
            file = open('gip.data', 'rb')
            Address.my_dict = pickle.load(file)  # Помещаем объект в файл.
            file.close()
        except FileNotFoundError:
            print("No file")
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.02.2020, 18:41
Ответы с готовыми решениями:

json и pickle
Как можно добавить возможность классу упаковки и распаковки данных с использованием json и pickle?

Pickle (некорректные символы)
Ребят, при добавлении словаря с данными в текстовый документ символы, выгляд вот так. Как исправить? Encoding - не работает, так как...

Pickle, почему ты возвращаешь None?
try: data_pickle = pickle.load(open("data.pickle", "rb")) except EOFError: # В случае если файл пустой: ...

1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
06.02.2020, 09:24
riomenx, Я со статическими методами и с декораторами, создаваемыми на их основе, знаком поверхностно, поэтому не буду разбираться в Вашем коде. Но могу ответить на вопрос, В чем разница между модулями pickle и shelve.
Во первых, модуль shelve использует в своей работе модуль pickle, и создан для того, что бы облегчить работу именно со словарями. При работе с модулем pickle, мы должны, если работаем со словарем, загружать каждый раз весь словарь, хранящийся в файле. Используя модуль shelve нам не нужно загружать из файла весь словарь, а работать с файлом как со словарем питона, используя все методы словаря.
Вот фрагмент программы, в которой используется shelve. Вам не нужно вникать в весь фрагмент, так как это вырезка из программы, но на дух строках из этого фрагмента, я покажу как используется shelve:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class RecordsBook:
    # класс Книга записей
    def __init__(self, nameBook, dicRec={}):
        # метод инициализации атрибутов экземпляров класса  и передача в метод значений для атрибутов
        self.nameBook = nameBook                   # инициализация атрибута Имя книги
        self.dicRec = dicRec                       # перечень записей в виде словаря, по умолчанию пустой
    def loadBook(self):
        # загрузка записей из базы данных
        db = shelve.open(self.nameBook)            # открытие базы данных (имя берется из атрибута nameBook класса)
        self.dicRec = dict(db.items())             # загрузка записей из базы данных в атрибут dicRec экземпляра класса (в словарь экземпляра класса)
        db.close()                                 # закрытие базы данных
    def saveBook(self):
        # сохранение записей в базе данных
        db = shelve.open(self.nameBook)            # открытие базы данных
        for (key, record) in self.dicRec.items():  # запись содержимого из 
            db[key] = record                       # словаря экземпляра класса в базу данных
        db.close()                                 # закрытие базы данных
Здесь объект файла базы данных обозначен переменной db. В строке
Python
1
        self.dicRec = dict(db.items())             # загрузка записей из базы данных в атрибут dicRec экземпляра класса (в словарь экземпляра класса)
мы используем стандартный метод словаря items() для чтения записей из базы данных. Но могли бы по ключу прочитать и одну запись из базы данных, не загружая весь словарь.
В строке
Python
1
            db[key] = record
мы осуществляем сохранение одной записи по ключу в базу данных, не загружая как в pickle всю базу данных (весь словарь).
Но более подробно и доходчиво Вы можете прочитать про модуль shelve в книге Лутц М. Программирование на Python. Том 1 (4-е издание, 2011) стр.66-68
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.02.2020, 09:24
Помогаю со студенческими работами здесь

Запись в файл методом pickle
Возникла нужда записать в файл введённые данные в виде словаря. вот код всей программы #!/usr/bin/env python3 import pickle ...

Как работать с модулем pickle?
Почему указан в коде второй протокол в строке ab = pickle.dumps(a, 2), а сверху 3 или 4? В чем смысл этого кода? >>>...

Добавление значений в файл через pickle
Доброго времени суток. Начал потихоньку мучать питона, не могу решить задачу: Надо записать "рекорды" в бинарный файл, но...

Как открыть файл на чтение и запись для pickle?
Я пытаюсь открыть файл с rb+, но после записи, pickle не может прочитать ничего из файла. Может стоит вместо dump и load исползовать...

Запись и чтение из бинарного файла списка из bool значений БЕЗ МОДУЛЯ pickle
У меня есть список из bool-переменных, и я хочу как то записать его в бинарный файл, не используя pickle. При этом, что бы я мог потом...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru