Рубрики
Без рубрики

Модуль pickle в Python

Модуль Python pickle используется для сериализации объекта в поток данных, который сохраняется в файл. Мы также можем десериализовать файл обратно в объект.

Автор оригинала: 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. Ссылки