Найти в Дзене
Властелин машин

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

Оглавление

Как бывает обидно после долгих мучений по сбору данных, внезапно всё потерять в связи с непредвиденной остановкой работы программы. Но все не так безнадежно, так как на этот случай в языках программирования имеется защитный механизм, который называется сериализацией информации. Рассмотрим, как ее осуществить в языке 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 является тот факт, что файлы могут подвергаться несанкционированным изменениям. Соответственно, если вы работаете с ними не самостоятельно, существует опасность встраивания в них вредоносного кода, который будет исполнен при попытке восстановления из формата. Поэтому не помешает дополнительная осторожность...
Какие еще полезные инструменты сериализации вам знакомы? Делитесь в комментариях!