Как сохранять программу в питоне

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

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

Обратите внимание, что модуль pickle не защищен от ошибочных или злонамеренно созданных данных в соответствии с документацией. Поэтому никогда не отбирайте данные, полученные из ненадежных или не аутентифицированных источников.

pickle.dump()

В этом разделе мы узнаем, как хранить данные с помощью Python pickle. Для этого мы должны сначала импортировать модуль pickle.

Затем используйте функцию pickle.dump() для сохранения данных объекта в файле. Функция pickle.dump() принимает 3 аргумента. Первый аргумент – это объект, который вы хотите сохранить. Второй аргумент – это объект файла, который вы получаете, открывая желаемый файл в двоичном режиме записи (wb). И третий аргумент – это аргумент «ключ-значение». Этот аргумент определяет протокол.

Как сохранить Python код в EXE файл

Существует два типа протокола – pickle.HIGHEST_PROTOCOL и pickle.DEFAULT_PROTOCOL. Пример кода:

import pickle # take user input to take the amount of data number_of_data = int(input(‘Enter the number of data : ‘)) data = [] # take input of the data for i in range(number_of_data): raw = input(‘Enter data ‘+str(i)+’ : ‘) data.append(raw) # open a file, where you ant to store the data file = open(‘important’, ‘wb’) # dump information to that file pickle.dump(data, file) # close the file file.close()

Следующая программа предложит вам ввести некоторые данные. В моем случае это было так.

Функция pickle dump в python

pickle.load()

Чтобы получить данные, шаги довольно просты. Для этого вам нужно использовать функцию pickle.load(). Основным аргументом функции загрузки pickle является объект файла, который вы получаете, открывая файл в режиме двоичного чтения (rb).

Давайте напишем код для получения данных, которые мы обработали, используя код дампа pickle.

import pickle # open a file, where you stored the pickled data file = open(‘important’, ‘rb’) # dump information to that file data = pickle.load(file) # close the file file.close() print(‘Showing the pickled data:’) cnt = 0 for item in data: print(‘The data ‘, cnt, ‘ is : ‘, item) cnt += 1

Результат будет следующим:

Пример

Я сделал короткое видео, показывающее выполнение примеров программы pickle – сначала для сохранения данных в файл, а затем для их загрузки и печати.

Пример pickle

Как вы можете видеть, файл, созданный через pickle dump, является двоичным файлом и показывает символы мусора в текстовом редакторе.

Важные замечания

Несколько важных моментов о модуле pickle в python:

4. Сохранение и запуск программы

  1. Протокол pickle специфичен для Python – его межъязыковая совместимость не гарантируется. Это означает, что вы, скорее всего, не сможете передать информацию, чтобы сделать ее полезной на других языках программирования.
  2. Также нет гарантии совместимости между различными версиями Python, поскольку не каждая структура данных Python может быть сериализована модулем.
  3. По умолчанию используется последняя версия протокола pickle, если вы не измените ее вручную.
  4. И последнее, но не менее важное: модуль pickle не защищен от ошибочных или злонамеренно созданных данных в соответствии с документацией.
Читайте также:
Как составлять программу исследования

Источник: pythonim.ru

Сохранение объектов в файл — Модуль pickle Python

20 января 2014 г. Archy Просмотров: 24601 RSS 1 pickle, pickle python, объекты в файл

Модуль pickle Python

Сохранить объекты в файл и в дальнейшем восстановить объекты из файла позволяют модули pickle и shelve. Модуль pickle предоставляет следующие функции:

dump(, [, ]) — производит сериализацию объекта и записывает данные в указанный файл. В параметре указывается файловый объект, открытый для записи. Ниже продемонстрирован способ сохранения объекта в файл.

>>> import pickle >>> f = open(r’file.txt’, ‘wb’) >>> obj = [«Строка», (2, 3)] >>> pickle.dump(obj, f) >>> f.close()

load() — читает сохраненные данные из файла и преобразует их в объект. В параметре указывается файловой объект, открытый для чтения. Пример восстановления объекта из файла.

>>> f = open(r’file.txt’, ‘rb’) >>> obj = pickle.load(f) >>> obj [‘xd0xa1xd1x82xd1x80xd0xbexd0xbaxd0xb0’, (2, 3)] >>> f.close()

Любой бизнес необходимо развивать, а для развития все средства хороши. Рекламная полиграфия от http://konus-u.com.ua/ поможет сделать вашу фирму узнаваемой. Чтобы быть у ваших клиентов каждый день под рукой можно напечатать фирменные блокноты которые будут на виду каждый день как напоминание о вашей продукции.

В один файл можно сохранить сразу несколько объектов, последовательно вызывая функцию dump(). Пример сохранения нескольких объектов приведен в листинге ниже.

>>> obj1 = [«Строка», (2, 3)] >>> obj2 = (5, 6) >>> f = open(r’file.txt’, ‘wb’) >>> pickle.dump(obj1, f) >>> pickle.dump(obj2, f) >>> f.close()

Для восстановления объектов нужно несколько раз вызвать функцию load()

>>> f = open(r’file.txt’, ‘rb’) >>> obj1 = pickle.load(f) >>> obj2 = pickle.load(f) >>> obj1, obj2 ([‘xd0xa1xd1x82xd1x80xd0xbexd0xbaxd0xb0’, (2, 3)], (5, 6)) >>> f.close()

Модуль pickle позволяет также преобразовать объект в строку и восстановить объект из строки. Для этого предназначены следующие функции:

dumps(, [, ]) — производит сериализацию объекта и возвращает строку специального формата. Формат этой строки зависит от указанного протокола (число от 0 до 2). В качестве примера выведем результат преобразования в различных протоколах.

>>> obj = [«Строка», (2, 3)] >>> pickle.dumps(obj) «(lp0nS’\xd0\xa1\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb0’np1na(I2nI3ntp2na.» >>> pickle.dumps(obj, 0) # Протокол 0 «(lp0nS’\xd0\xa1\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb0’np1na(I2nI3ntp2na.» >>> pickle.dumps(obj, 1) # Протокол 0 ‘]qx00(Ux0cxd0xa1xd1x82xd1x80xd0xbexd0xbaxd0xb0qx01(Kx02Kx03tqx02e.’ >>> pickle.dumps(obj, 2) # Протокол 2 ‘x80x02]qx00(Ux0cxd0xa1xd1x82xd1x80xd0xbexd0xbaxd0xb0qx01Kx02Kx03x86qx02e.’

Источник: python-3.ru

Модуль Pickle в Python

Pickling – популярный способ консервирования продуктов. Согласно Википедии, это тоже довольно древняя процедура – хотя происхождение маринования неизвестно, древние месопотамцы, вероятно, использовали этот процесс 4400 лет назад. Поместив продукт в определенный раствор, можно увеличить срок его хранения. Другими словами, это метод, который позволяет нам хранить пищу для последующего употребления.

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

Что такое сериализация в Python?

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

Объекты в Python также можно сериализовать с помощью модуля под названием Pickle.

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

Читайте также:
Лучшая программа для записи видео с экрана телефона Андроид

Pickling (или сериализацию в целом) не следует путать со сжатием. Целью Pickling является перевод данных в формат, который может быть перенесен из ОЗУ на диск. С другой стороны, сжатие – это процесс кодирования данных с использованием меньшего количества бит (для экономии места на диске).

Сериализация особенно полезна в любом программном обеспечении, где важно иметь возможность сохранить некоторый прогресс на диске, выйти из программы, а затем загрузить прогресс обратно после повторного открытия программы. Видеоигры могут быть наиболее интуитивным примером полезности сериализации, но есть много других программ, в которых сохранение и загрузка данных или прогресса пользователя имеет решающее значение.

Сравнение pickle и JSON

Возможно, вы слышали о JSON (нотация объектов JavaScript), который является популярным форматом, который также позволяет разработчикам сохранять и передавать объекты, закодированные в виде строк. Этот метод сериализации имеет некоторые преимущества перед сохранением. Формат JSON удобочитаем, не зависит от языка и быстрее, чем pickle.

Однако у него есть и некоторые важные ограничения. Что наиболее важно, по умолчанию только ограниченное подмножество встроенных типов Python может быть представлено JSON. С помощью Pickle мы можем легко сериализовать очень широкий спектр типов Python и, что важно, настраиваемые классы. Это означает, что нам не нужно создавать настраиваемую схему (как мы делаем для JSON) и писать сериализаторы и парсеры, подверженные ошибкам. С Pickle вся тяжелая работа будет сделана за вас.

Что можно сериализовать?

  • Все собственные типы данных, поддерживаемые Python (логические, None, целые числа, числа с плавающей запятой, комплексные числа, строки, байты, байтовые массивы).
  • Словари, наборы, списки и кортежи – если они содержат выбираемые объекты.
  • Функции и классы, определенные на верхнем уровне модуля.

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

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

Также очень важно отметить, что маринованные предметы могут использоваться специально. Например, извлечение данных из ненадежного источника может привести к выполнению вредоносного кода.

Использование модуля

В следующем очень простом примере показаны основы использования модуля Pickle в Python 3:

import pickle test_list = [‘cucumber’, ‘pumpkin’, ‘carrot’] with open(‘test_pickle.pkl’, ‘wb’) as pickle_out: pickle.dump(test_list, pickle_out)

Во-первых, мы должны импортировать модуль pickle, что выполняется в строке 1. В строке 3 мы определяем простой список из трех элементов, который будет обработан.

В строке 5 мы указываем, что имя нашего выходного файла pickle будет test_pickle.pkl. Используя параметр wb, мы сообщаем программе, что хотим записать (w) двоичные данные (b) внутри нее (потому что мы хотим создать поток байтов). Обратите внимание, что расширение pkl не обязательно – мы используем его в этом руководстве, потому что это расширение включено в документацию Python.

Читайте также:
Компьютера сделать 10 программа

В строке 6 мы используем метод pickle.dump(), чтобы собрать наш тестовый список и сохранить его в файле test_pickle.pkl.

Я рекомендую вам попробовать открыть сгенерированный файл pickle в текстовом редакторе. Вы быстро заметите, что поток байтов определенно не является удобочитаемым форматом.

Распаковка

Теперь давайте раскроем содержимое тестового файла pickle и вернем наш объект к его исходной форме.

import pickle with open(‘test_pickle.pkl’, ‘rb’) as pickle_in: unpickled_list = pickle.load(pickle_in) print(unpickled_list)

Как видите, эта процедура не сложнее, чем когда мы мариновали объект. В строке 3 мы снова открываем наш файл test_pickle.pkl, но на этот раз наша цель – прочитать (r) двоичные данные (b), хранящиеся в нем.

Затем, в строке 5, мы используем метод pickle.load(), чтобы распаковать наш список и сохранить его в переменной unpickled_list.

Затем вы можете распечатать содержимое списка, чтобы убедиться, что он идентичен списку, который мы выбрали в предыдущем примере. Вот результат выполнения приведенного выше кода:

$ python unpickle.py [‘cucumber’, ‘pumpkin’, ‘carrot’]

Сериализация и распаковка нестандартных объектов

Как я упоминал ранее, используя Pickle, вы можете сериализовать свои собственные настраиваемые объекты. Взгляните на следующий пример:

import pickle class Veggy(): def __init__(self): self.color = » def set_color(self, color): self.color = color cucumber = Veggy() cucumber.set_color(‘green’) with open(‘test_pickle.pkl’, ‘wb’) as pickle_out: pickle.dump(cucumber, pickle_out) with open(‘test_pickle.pkl’, ‘rb’) as pickle_in: unpickled_cucumber = pickle.load(pickle_in) print(unpickled_cucumber.color)

Как видите, этот пример почти такой же простой, как и предыдущий. Между строками 3 и 7 мы определяем простой класс, который содержит один атрибут и один метод, который изменяет этот атрибут. В строке 9 мы создаем экземпляр этого класса и сохраняем его в переменной cucumber, а в строке 10 мы устанавливаем цвет его атрибута на «зеленый».

Затем, используя те же функции, что и в предыдущем примере, мы сериализуем и отделяем наш только что созданный объект. Выполнение приведенного выше кода приводит к следующему выводу:

$ python unpickle_custom.py green

Помните, что мы можем распаковать объект только в среде, где класс Veggy либо определен, либо импортирован. Если мы создадим новый скрипт и попытаемся выделить объект без импорта класса Veggy, мы получим «AttributeError». Например, выполните следующий скрипт:

import pickle with open(‘test_pickle.pkl’, ‘rb’) as pickle_in: unpickled_cucumber = pickle.load(pickle_in) print(unpickled_cucumber.color)

В выводе приведенного выше скрипта вы увидите следующую ошибку:

$ python unpickle_simple.py Traceback (most recent call last): File «», line 2, in unpickled_cucumber = pickle.load(pickle_in) AttributeError: Can’t get attribute ‘Veggy’ on

Заключение

Как видите, благодаря модулю Pickle сериализация объектов Python довольно проста. В наших примерах мы выбрали простой список, но вы можете использовать тот же метод для сохранения большого спектра типов данных Python, если вы убедитесь, что ваши объекты содержат только другие выбираемые объекты.

У Pickling есть некоторые недостатки, самый большой из которых может заключаться в том, что вы можете распаковать свои данные только с помощью Python – если вам нужно кросс-языковое решение, JSON определенно лучший вариант. И, наконец, помните, что сериализованные объекты можно использовать для переноса кода, который вы не обязательно хотите выполнять.

Источник: tonais.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru