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

Файл не сохраняет изменения после работы

21.01.2023, 16:04. Показов 970. Ответов 5

Студворк — интернет-сервис помощи студентам
Писал адресную книгу по заданию в вузе, учитывая, что уровень знаний python не самый лучший, не понимаю почему программа не сохраняет изменения после выполнения работы. Через раз сохраняет на 2 запуска, потом все слетает.
Вот код:
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
import pickle
 
addressBook = {'Andrew': '22 street'}
 
 
class Ab:
 
    def save():
        with open('addressBook.pickle', 'wb') as f:
            pickle.dump(addressBook, f)
 
    def load():
        with open('addressBook.pickle', 'rb') as f:
            addressBook_new = pickle.load(f)
            print(addressBook_new)
 
    def add():
        name = input("Введите имя: ")
        address = input("Введите адрес: ")
        addressBook[name] = address
        print("Адрес добавлен")
 
    def delete():
        name = input("Введите имя, данные которого хотите удалить: ")
        del addressBook[name]
        print("Адрес удалён")
 
    def printAb():
        for name, address in addressBook.items():
            print("Адрес {0}: {1}".format(name, address))
 
    def change():
        name = input("Введите имя, чей адрес вы хотите изменить: ")
        address = input("Введите новый адрес: ")
        addressBook[name] = address
 
    def find():
        name = input("Введите имя, чей адрес вы хотите узнать: ")
        print(addressBook[name])
 
 
Ab.load()
Ab.save()
 
 
num = int(input("Что вы хотите сделать?\n 1-Добавить новый адрес.\n 2-Удалить существующий адрес.\n 3-Вывести все "
                "адреса в адресной книге.\n 4-Изменить существующий адрес.\n 5-Найти определённый адрес из книги. "))
 
if num == 1:
    Ab.add()
elif num == 2:
    Ab.delete()
elif num == 3:
    Ab.printAb()
elif num == 4:
    Ab.change()
elif num == 5:
    Ab.find()
else:
    print("Введите 1 из указанных цифр")
 
print(addressBook)
Ab.save()
Буду благодарен за советы и решение проблемы
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.01.2023, 16:04
Ответы с готовыми решениями:

Файл не сохраняет изменения
Решил написать программу для игры в слова. Играет реальный человек и компьютер. Человек вводит слово, а компьютер подбирает соответствующее...

Файл css не сохраняет изменения
В чем может быть проблема, вношу изменения в файл css, сохраняю, обновляюсь на сайте, изменений нет? Открываю css файл, параметры остались...

Не сохраняет результаты работы программы после её закрытия и нюансы работы с индексацией
Вот код: private void ConfimAddBookButtom_Click(object sender, EventArgs e) { if...

5
207 / 58 / 19
Регистрация: 18.02.2018
Сообщений: 257
21.01.2023, 17:17
Ты при загрузке книги игнорируешь её содержимое. Поэтому когда ты вносишь запись, она присоединяется к глобальной переменной addressBook с одним ключом, и этот addressBook перезаписывает твою книгу. Никакой магии, код делает то, что ты требуешь, словарь целый, операции над ним допустимые... Присвой что ли addressBook_new to addressBook

Ещё я бы добавил тебе в метод загрузки данных пару проверок:

Code
1
2
3
4
5
6
7
8
9
10
11
12
     def load():
         with open('addressBook.pickle', 'rb') as f:
-            addressBook_new = pickle.load(f)
-            print(addressBook_new)
+            try:
+                addressBook_new = pickle.load(f)
+                print(addressBook_new)
+            except FileNotFoundError:
+                print('Нет такого файла')
+                return
+            except EOFError:
+                return('Файл повреждён')
1
0 / 0 / 0
Регистрация: 21.01.2023
Сообщений: 8
22.01.2023, 14:14  [ТС]
ksyrx, Как сделать, чтоб при загрузке книги считывалось её содержимое?
0
-9 / 6 / 1
Регистрация: 22.01.2023
Сообщений: 17
22.01.2023, 15:35
The problem with your code is that you are only saving the addressBook dictionary to the addressBook.pickle file once at the beginning of the program, before making any changes to it. So when the program terminates the changes made to the address book during the program's execution are lost.

To solve this, you need to call the save() method after any changes are made to the addressBook dictionary. You should add a call to the save() method after each of the add(), delete(), change() and find() methods.

Here is the corrected version of the code:

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
import pickle
 
addressBook = {'Andrew': '22 street'}
 
class Ab:
 
    def save():
        with open('addressBook.pickle', 'wb') as f:
            pickle.dump(addressBook, f)
 
    def load():
        with open('addressBook.pickle', 'rb') as f:
            addressBook_new = pickle.load(f)
            print(addressBook_new)
 
    def add():
        name = input("Enter the name: ")
        address = input("Enter the address: ")
        addressBook[name] = address
        print("Address added")
        Ab.save()  # call the save method to save the changes to the address book
 
    def delete():
        name = input("Enter the name of the entry you want to delete: ")
        del addressBook[name]
        print("Address deleted")
        Ab.save()  # call the save method to save the changes to the address book
 
    def printAb():
        for name, address in addressBook.items():
0
207 / 58 / 19
Регистрация: 18.02.2018
Сообщений: 257
22.01.2023, 19:06
Лучший ответ Сообщение было отмечено rhmff как решение

Решение

Цитата Сообщение от rhmff Посмотреть сообщение
Как сделать, чтоб при загрузке книги считывалось её содержимое?
Code
1
python3 main.py 'addressBook.pickle'
main.py
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
from pickle import dump, load, UnpicklingError
from sys import argv
 
class AddressBook:
    def __init__ (self, fname: str = 'ab.pickle'):
        self.__fname = fname
        self.__records = dict()
        if self.load() < 0:
            print('[Info]: Creating a new book \'%s\'...' %(fname))
            self.save()
 
    def save (self):
        with open(self.__fname, 'wb') as f:
            dump(self.__records, f)
 
    def load (self) -> int:
        try:
            with open(self.__fname, 'rb') as f:
                try:
                    self.__records = load(f)
                except (EOFError, ValueError, UnpicklingError):
                    print('[Warn]: \'%s\' is corrupted. Removing it...' \
                        %(self.__fname))
                    from os import remove; remove(self.__fname)
                    return -1
        except FileNotFoundError:
            print('[Warn]: Could not find \'%s\'' %(self.__fname))
            return -2
        print('[Info]: \'%s\' has been opened successfully' %(self.__fname))
        self.dump()
        return 0
 
    def add (self):
        name = input("Name: ")
        addr = input("Address: ")
        self.__records[name] = addr
        print("[Info]: The address has been added successfully")
 
    def delete (self):
        name = input("Name: ")
        if self.__records.get(name) == None:
            print('[Info]: No such name')
            return
        del self.__records[name]
        print("[Info]: The address has been deleted successfully")
 
    def dump (self):
        for name, addr in self.__records.items():
            print('[Info]: \'%s\': \'%s\'' %(name, addr))
 
    def modify (self):
        name = input("Name: ")
        if self.__records.get(name) == None:
            print('[Info]: No such name')
            return
        addr = input("Address: ")
        self.__records[name] = addr
        print('[Info]: The address has been modified successfully')
 
    def find (self):
        name = input("Name: ")
        if self.__records.get(name) == None:
            print('[Info]: No such name')
            return
        print(self.__records[name])
 
if len(argv) - 1 == 1:
    ab = AddressBook(argv[1])
else:
    ab = AddressBook()
 
print('1. Add a new address.')
print('2. Delete an existing address.')
print('3. Print all addresses.')
print('4. Modify an existing address.')
print('5. Find a specific address.')
print('0. Save and exit.')
num = -1
while True:
    print('Action: ', end='')
    try:
        num = int(input())
    except ValueError:
        continue
    if num == 1:
        ab.add()
    elif num == 2:
        ab.delete()
    elif num == 3:
        ab.dump()
    elif num == 4:
        ab.modify()
    elif num == 5:
        ab.find()
    elif num == 0:
        break
    else:
        print('[Info]: Invalid action')
 
ab.dump()
ab.save()
0
0 / 0 / 0
Регистрация: 21.01.2023
Сообщений: 8
23.01.2023, 13:45  [ТС]
ksyrx, спасибо огромное
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.01.2023, 13:45
Помогаю со студенческими работами здесь

После работы магазина компьютер сохраняет данные о динамике продаж товаров в форме списка
Прошу помочь, нужно срочно! После работы магазина компьютер сохраняет данные о динамике продаж товаров в форме списка : код товара, имя...

Магнитола не сохраняет последний воспроизведённый файл (с флешки), а позицию сохраняет
Во общем в машине есть магнитола JVC, в ней есть CD диск, USB flash накопитель и радио... Так вот: если на флешке будет играть музыка то...

Программа которая читает .тхт и меняет номер после определённого словосочетания, сохраняет файл
У меня очень большой текст и среди текста нужно найти номер он будет от 0,01 до 1000,99 пример Тут мусорный текст Тут мусорный...

ADODataSet не сохраняет изменения
Доброго времени суток, возникла проблема. после модификации ячеек таблицы подключенной через adoDataSet не сохраняются данные после...

Не сохраняет в базу изменения
Есть форма с dgv. При нажатие на кнопку &quot;изменить данные&quot; открывается новая форма, где выводится в текстбоксы данные текущей строки dgv....


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 16.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 15.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru