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