Страницы

Поиск по вопросам

суббота, 16 марта 2019 г.

Запись и чтение в файл через pickle

Хочу разобраться с записью/чтением в файл. Есть код:
import pickle result = {'vova':'8', 'stepa': '6', 'primer':'9', 'vovas': '12'} dee = open('dadt.dat','ab') pickle.dump(result,dee) dee.close() dee = open('dadt.dat','rb') der = pickle.load(dee) for i in der: print(i, der[i])
Что я ожидаю от него - выводить то что есть в файле, если меняю список result - дописывать новые значения (проверка на дубли за рамками задачи).
Что получаю - вывод корректно производится один раз, однако при изменении словаря и повторной записи - выводит то же самое, что и в первый раз.
Скажем меняю result на
result = {'vova':'8', 'stepa': '6', 'primer':'9', 'vovas': '12', 'novoe':'12'}
А получаю такой же вывод, как и в первом случае.
Подскажите, что делаю не так?


Ответ

Ваша проблема в том, что вы считываете значение из файла только один раз. pickle не даёт возможности синхронизации файла с переменной, поэтому вам нужно осуществлять это самостоятельно каждый раз.
Также если вы открываете файл на добавление (ключ 'a'), то содержимое переменной запишется в конец файла (т.е. при втором вызове в файле будет записано уже две переменных, при третьем -- три и так далее). Функция pickle.load считывает за один вызов только один объект из файла, поэтому вам придётся вызывать её несколько раз, чтобы добраться до последней сохранённой переменной.
Если я правильно понял вашу задачу, вам не нужно хранить разные состояния вашей переменной, а достаточно только последнего, но обновлённого. Для этого нужно открывать файл на чтение (ключ 'w'), что будет перезаписывать файл каждый раз, когда вы сохраняете обновления вашей переменной.
После этого просто сохраняйте переменную тогда, когда вам нужно учесть её обновления и загружайте их из файла дампа при необходимости синхронизации с записанным в файл состоянием.
import pickle result = {'vova':'8', 'stepa': '6', 'primer':'9', 'vovas': '12'}
# сохраняем словарь в файл with open('dump.dat', 'wb') as dump_out: pickle.dump(result, dump_out)
# загружаем словарь из файла with open('dump.dat', 'rb') as dump_in: der = pickle.load(dump_in)
for key, value in der.items(): print(key, value)
# обновляем словарь result = {'vova':'8', 'stepa': '6', 'primer':'9', 'vovas': '12', 'novoe':'12'}
# снова сохраняем словарь в файл with open('dump.dat', 'wb') as dump_out: pickle.dump(result, dump_out)
# снова загружаем словарь из файла with open('dump.dat', 'rb') as dump_in: der = pickle.load(dump_in)
for key, value in der.items(): print(key, value)
Также обратите внимание на конструкцию with для работы с файлами и на метод .items() у словаря, который возвращает генератор всех пар ключ-значение этого словаря.

Комментариев нет:

Отправить комментарий