python
February 5, 2021

Простой способ сохранить данные, чтобы не искать их в будущем

Как  бывает обидно после долгих мучений по сбору данных, внезапно всё  потерять в связи с непредвиденной остановкой работы программы.  Но все  не так безнадежно, так как на этот случай в языках программирования  имеется защитный механизм, который называется сериализацией информации.  Рассмотрим, как ее осуществить в языке Python.

Проблема  промежуточного сохранения информации особо актуальна для тех, кто  проводит парсинг/скрапинг данных, так как  сайты опасаются быстрого  роста запросов и обвала своих серверов, периодически разрывая  соединения. Вот именно в таких случаях и выручит сериализация. В Python  она реализуется модулем pickle.

Сохранение объектов с помощью pickle

Для сохранения потребуется:

  1. открыть файл на запись в бинарном режиме;
  2. вызвать функцию pickle.dump с параметрами - объект для сохранения и  файл из пункта 1;
  3. закрыть файл из пункта 1.

Еще проще для открытия/закрытия файла использовать конструкцию with open. Ниже представлен код для сохранения в файл с именем params словаря d.

import pickle
d= {'page':100,'records':5}
with open('params', 'wb') as f_w:
   pickle.dump(d, f_w)

Восстановление объектов с помощью pickle

Для восстановления нужно осуществить следующие шаги:

  • открыть файл на чтение в бинарном режиме;
  • присвоить восстанавливаемой переменной значение результата вызова функции pickle.load с параметром описателя  файла из пункта 1;
  • закрыть файл из пункта 1.

Все это также можно проделать с помощью конструкции with open. Ниже представлен код для восстановления ранее сохраненного словаря:

with open('params','rb') as f_r:
   d = pickle.load(f_r)

Если в файл требуется сохранить несколько объектов, то необходимо для каждого вызвать функцию pickle.dump. Затем для их восстановления потребуется в том же порядке вызывать pickle.load:

import pickle
d1 = {'page':100,'records':5}
d2 = {'page':130,'records':2}
with open('params', 'wb') as f_w:
   pickle.dump(d1, f_w)
   pickle.dump(d2, f_w)

with open('params','rb') as f_r:
   d1 = pickle.load(f_r)    
   d2 = pickle.load(f_r)

Модуль shelve

Еще более продвинутые механизмы предлагает модуль shelve.  В частности, он предоставляет возможность сохранения объектов по ключу.  Например, аналогичные вышеуказанным операциям сохранения словарей d1 и  d2 можно произвести следующим образом:

import shelve
d1 = {'page':100,'records':5}
d2 = {'page':130,'records':2}
with shelve.open('db') as db:
   db['d1'] = d1
   db['d2'] = d2

with shelve.open('db') as db:
   d1 = db['d1']
   d2 = db['d2']

Напоследок отмечу, что недостатком использования pickle  является тот факт, что файлы могут подвергаться несанкционированным  изменениям. Соответственно, если вы работаете с ними не самостоятельно,   существует опасность встраивания в них  вредоносного кода, который  будет исполнен при попытке восстановления из формата. Поэтому не  помешает дополнительная осторожность...
Какие еще полезные инструменты сериализации вам знакомы? Делитесь в комментариях!