Автор оригинала: Pankaj Kumar.
Мы часто сталкиваемся с ситуацией, когда нам нужно хранить или переносить объекты. Модуль pickle
в Python является одной из таких библиотек, которая служит для хранения объектов Python в виде сериализованной последовательности байтов в файлы для последующего извлечения. Давайте рассмотрим, что именно он делает в этой статье.
1. Примеры модулей рассола Python
Давайте рассмотрим некоторые примеры использования модуля pickle в Python.
1.1) “маринование” в файл
Поскольку файл состоит из байтов информации, мы можем преобразовать объект Python в файл с помощью модуля pickle
. Это называется маринованием. Давайте посмотрим, как мы могли бы это сделать на примере.
Для выполнения этой операции сериализации объекта в файл мы используем метод pickle.dump ()
.
Формат: pickle.dump(data_to_store, имя файла, protocol_type)
data_to_store
-> Объект, подлежащий сериализации (маринованный)имя файла
-> Имя файла, в котором хранятся данныеprotocol_type
-> Тип используемого протокола (по умолчанию в Python 3.8 установлено значение 4)
Вот пример, иллюстрирующий то же самое.
import pickle data = ['one', 2, [3, 4, 5]] with open('data.dat', 'wb') as f: pickle.dump(data, f)
1.2) “Распаковка” из файла
Это прямо противоположно травлению, при котором объект извлекается из файла. Файл, содержащий сериализованную информацию объекта в виде последовательности байтов, теперь десериализуется в сам объект Python, и мы можем получить исходную информацию обратно.
Для выполнения этой операции мы используем pickle.load()
библиотечная функция.
Формат: new_object.load(имя файла)
new_object
-> Объект, в который метод хранит информациюимя файла
-> Файл, содержащий сериализованную информацию
import pickle objdump = None with open('data.dat', rb') as f: # Stores the now deserialized information into objdump objdump = pickle.load(f)
2. Обработка исключений с помощью модуля pickle
Модуль Pickle определяет некоторые исключения, которые полезны программистам или разработчикам для обработки различных сценариев и их соответствующей отладки.
В модуле упоминается, что можно мариновать следующее:
Нет
,Истина
,Ложь
- целые числа, плавающие точки, комплексные числа
- строки, байты, массивы байтов
- кортежи, списки, наборы и словари, содержащие только picklable объекты
- Именованные функции, определенные на верхнем уровне модуля
- Классы и встроенные функции, определенные на верхнем уровне модуля
Любой другой объект не является пиклируемым и называется непиклируемым .
Есть 3 основных исключения, которые определяет модуль, а именно:
Имя исключения | Когда возникает это исключение? |
Имя исключения | Это всего лишь базовый класс для других исключений. Это наследует исключение |
Имя исключения | Возникает при обнаружении непиклируемого объекта. |
Имя исключения | Возникает во время распаковки объекта, если есть какие-либо проблемы (например, |
Вот пример использования обработки исключений для обработки pickle.PicklingError
, при попытке замариновать непиклируемый объект.
import pickle # A lambda is unpicklable data = ['one', 2, [3, 4, 5], lambda l: 1] with open('data2.dat', 'wb') as f: try: pickle.dump(data, f) except pickle.PicklingError: print('Error while reading from object. Object is not picklable')
Выход
Error while reading from object. Object is not picklable
Вот пример использования обработки исключений для обработки pickle.UnpicklingError
, при попытке распаковать несериализованный файл.
import pickle with open('data1.dat', 'wb') as f: f.write('This is NOT a pickled file. Trying to unpickle this will cause an exception') objdump = None with open('data1.dat', 'rb') as f: try: objdump = pickle.load(f) except pickle.UnpicklingError: print('Cannot write into object')
Выход
Cannot write into object
3. Проблемы, возникающие при мариновании и распаковке
- Как указано в документации модуля, он дает нам строгое предупреждение относительно маринования и распаковки файлов объектов. Не используйте этот модуль для распаковки, если вы не полностью доверяете источнику, так как в объектный файл может быть введен любой вредоносный код.
- Кроме того, могут возникнуть проблемы из-за отсутствия совместимости между языковыми версиями Python, поскольку структуры данных могут отличаться от версии к версии, и, следовательно,
Python 3.0
не сможет распаковать маринованный файл изPython 3.8
.
- Также отсутствует межъязыковая совместимость, что может вызвать раздражение при передаче данных не на Python. Эта информация относится только к Python.
4. Заключение
Здесь мы узнали больше о модуле pickle
, который можно использовать для сериализации/десериализации объектов Python в/из файлов. Это быстрый и простой способ передачи и хранения объектов Python, который помогает программистам легко и быстро хранить данные для передачи данных.
5. Ссылки
- JournalDev статья о рассоле: https://www.journaldev.com/15638/python-pickle-example
- Документация по модулю рассола: https://docs.python.org/3/library/pickle.html