Вы когда-нибудь хотели сохранить сложный объект Python в файл или отправить его по сети без потери его атрибутов и поведения?

Если это так, вам может быть интересно узнать о pickling и unpickling в Python.

Pickling и unpickling — это термины, используемые для описания процесса преобразования объекта Python в поток байтов и наоборот с использованием встроенного модуля pickle.

Это позволяет вам хранить или передавать любой Python object, например lists, dictionaries, classes или functions, и воссоздавать их позже в том же или другом процессе Python.

Из этого поста в блоге вы узнаете:

  • Что такое pickling и unpickling в Python и почему они полезны
  • Как создавать объекты pickle и unpickle в Python с помощью модуля pickle
  • Каковы преимущества и недостатки pickling и unpickling в Python
  • Каковы некоторые рекомендации для pickling и unpickling в Python

К концу этой записи в блоге вы сможете эффективно и безопасно использовать pickling и unpickling в Python для своих собственных проектов.

Отказ от ответственности. Выбор и распаковка в Python могут представлять угрозу безопасности, если вы загружаете данные из ненадежных источников, поскольку во время распаковки может выполняться вредоносный код. Вы должны загружать данные только из надежных источников или проверять их целостность перед загрузкой. Вы также можете использовать более безопасные альтернативы, такие как модули json или csv, для загрузки данных из ненадежных источников.

Что такое пикировка и распаковка в Python?

Pickling — это процесс сериализации объекта Python в поток байтов, который можно сохранить в файле или базе данных или отправить по сети. Unpickling — это обратный процесс десериализации потока байтов обратно в объект Python.

Травление и рассол может быть полезно, когда вы хотите:

  • Сохраняйте сложные структуры данных на диск или в базу данных без необходимости писать собственные форматы файлов или синтаксические анализаторы.
  • Передавайте данные между различными процессами или машинами Python, не беспокоясь о проблемах совместимости.
  • Сохраняйте состояние и поведение объектов Python, которые трудно воспроизвести другими средствами.

Например, предположим, что у вас есть список dictionaries, который содержит некоторую информацию о ваших любимых спортсменах:

athletes = [
  {"name": "Cristiano Ronaldo", "club": "Manchester United", "goals": 783},
  {"name": "Lionel Messi", "club": "PSG", "goals": 778},
  {"name": "Eden Hazard", "club": "Real Madrid", "goals": 173},
  {"name": "Luis Suarez", "club": "Atletico Madrid", "goals": 507},
  {"name": "Neymar", "club": "PSG", "goals": 411}
]

Если вы хотите сохранить эти данные в файл или отправить их в другую программу Python, вы можете сделать это легко и эффективно с помощью травления и распаковки.

Как собирать и распаковывать объекты в Python

Чтобы собирать и распаковывать объекты в Python, вам нужно использовать модуль pickle. Модуль pickle обеспечивает две основные функции: pickle.dump и pickle.load.

pickle.dump принимает объект в качестве аргумента и записывает его в файлоподобный объект (такой как открытый файл или объект BytesIO) в двоичном формате. Файлоподобный объект должен быть открыт в режиме двоичной записи (wb).

pickle.load принимает файлоподобный объект в качестве аргумента и считывает из него данные. Он возвращает объект, построенный из данных. Файлоподобный объект должен быть открыт в двоичном режиме чтения (rb).

Вот пример того, как собирать и распаковывать список спортсменов из предыдущего раздела:

# Import pickle module
import pickle

# Open a file in binary write mode
with open("athletes.pkl", "wb") as f:
  # Pickle the list and write it to the file
  pickle.dump(athletes, f)

# Open the same file in binary read mode
with open("athletes.pkl", "rb") as f:
  # Unpickle the list and assign it to a new variable
  new_athletes = pickle.load(f)

# Print the new list
print(new_athletes)

Результат:

[{'name': 'Cristiano Ronaldo', 'club': 'Manchester United', 'goals': 783}, {'name': 'Lionel Messi', 'club': 'PSG', 'goals': 778}, {'name': 'Eden Hazard', 'club': 'Real Madrid', 'goals': 173}, {'name': 'Luis Suarez', 'club': 'Atletico Madrid', 'goals': 507}, {'name': 'Neymar', 'club': 'PSG', 'goals': 411}]

Как видите, список new_athletes идентичен исходному списку athletes. Модуль pickle сохранил структуру и содержание списка.

Вы также можете использовать функции pickle.dumps и pickle.loads для выделения и удаления объектов в памяти без использования файла. pickle.dumps возвращает объект байтов, который содержит замаринованное представление объекта, а pickle.loads принимает объект байтов и возвращает незавершенный объект.

Вот пример использования этих функций:

# Import pickle module
import pickle

# Create a sample Python object
data = {"a": [1, 2.0, 3, 4+6j], "b": ("character string", b"byte string"), "c": {None, True, False}}

# Pickle the object and assign it to a bytes object
pickled_data = pickle.dumps(data)

# Print the pickled data
print(pickled_data)

# Unpickle the data and assign it to a new variable
restored_data = pickle.loads(pickled_data)

# Print the restored data
print(restored_data)

Результат:

b'\x80\x04\x95y\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x01a\x94]\x94(K\x01G@\x00\x00\x00\x00\x00\x00\x00K\x03\x8c\x08builtins\x94\x8c\x07complex\x94\x93\x94G@\x10\x00\x00\x00\x00\x00\x00G@\x18\x00\x00\x00\x00\x00\x00\x86\x94R\x94e\x8c\x01b\x94\x8c\x10character string\x94C\x0bbyte string\x94\x86\x94\x8c\x01c\x94\x8f\x94(\x89\x88N\x90u.'
{'a': [1, 2.0, 3, (4+6j)], 'b': ('character string', b'byte string'), 'c': {False, True, None}}

Как видите, pickled data — это байтовый объект, содержащий двоичное представление словаря data . Словарь restored_data идентичен исходному словарю данных.

Преимущества и недостатки травления и распаковки в Python?

У травления и распаковки в Python есть некоторые преимущества и недостатки, о которых вы должны знать перед их использованием.

Некоторые из преимуществ:

  • Pickling может сэкономить место в памяти, сжимая сложные структуры данных в потоки байтов.
  • Pickling может сохранить состояние и поведение объектов Python, которые нелегко воспроизвести другими средствами, такими как классы или функции.
  • Pickling может облегчить передачу данных между различными процессами или машинами Python, не беспокоясь о проблемах совместимости.

Некоторые из недостатков:

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

Некоторые лучшие практики для травления и распаковки в Python?

Чтобы эффективно и безопасно использовать травление и распаковку в Python, вот несколько рекомендаций, которым вы должны следовать:

  • Выберите подходящую версию протокола для вашего варианта использования. Модуль pickle поддерживает шесть версий протокола, от 0 до 5. Чем выше версия протокола, тем он эффективнее и продвинутее, но он может быть несовместим со старыми версиями Python. Вы можете указать версию протокола в качестве аргумента функции pickle.dump или pickle.dumps. Если вы не укажете его, будет использоваться версия протокола по умолчанию (3 для Python 3.x). Вы также можете использовать -1 для указания самой высокой доступной версии протокола.
  • Изящно обрабатывайте ошибки и исключения. Модуль pickle может вызывать различные ошибки или исключения во время травления или распаковки, например PickleError, UnpicklingError или AttributeError. Вы должны использовать блоки try-except, чтобы перехватывать эти ошибки или исключения и обрабатывать их соответствующим образом, например, регистрировать их, отображать или прерывать операцию.
  • Избегайте загрузки данных из ненадежных источников. Загрузка обработанных данных из ненадежных источников может представлять угрозу безопасности, поскольку может выполнять вредоносный код во время unpickling. Вы должны загружать данные только из надежных источников или проверять их целостность перед загрузкой. Вы также можете использовать более безопасные альтернативы, такие как модули json или csv для загрузки данных из ненадежных источников.
  • Используйте пользовательские классы с осторожностью. Выбрать пользовательские классы может быть сложно, так как это зависит от различных факторов, таких как inheritance, attributes, methods и references. Вы должны убедиться, что ваши пользовательские классы четко определены и задокументированы, а также что они реализуют методы getstate и setstate для управления тем, как они маринуются и распаковываются. Вам также следует избегать изменения определения или местоположения класса после его выделения, так как это может привести к ошибкам или несоответствиям во время извлечения.

Вы можете найти весь написанный код в этой записи блога на replit.

Заключение

Из этого поста в блоге вы узнали:

  • Что такое pickling и unpickling в Python и почему они полезны
  • Как собирать и распаковывать объекты в Python с помощью модуля pickle
  • Каковы преимущества и недостатки травления и распаковки в Python
  • Каковы некоторые лучшие практики для травления и распаковки в Python

Следуя этим советам и методам, вы сможете эффективно и безопасно использовать консервирование и распаковывание в Python для своих собственных проектов.

Если вы нашли эту запись в блоге полезной, поделитесь ею со своими друзьями или коллегами, которым может быть интересно узнать больше о рассолевании и распаковывании в Python.

И если у вас есть какие-либо вопросы или отзывы, пожалуйста, оставьте комментарий ниже. Я хотел бы услышать от вас!

Если вам понравилась статья, подпишитесь на нашу новостную рассылку, чтобы получать такие потрясающие материалы прямо на свой почтовый ящик.

Первоначально опубликовано на https://programmingeeksclub.com.

Вы можете следить за мной в Twitter, Мой блог.