Соленые огурцы в Python вкусны в том смысле, что они представляют объект Python в виде строки байтов. Многое можно сделать с этими байтами. Например, вы можете хранить их в файле или базе данных или передавать их по сети.
Маринованное представление объекта Python называется файлом консервирования. Таким образом, маринованный файл можно использовать для разных целей, например, для сохранения результатов, которые будут использоваться другой программой Python, или для создания резервных копий. Чтобы получить исходный объект Python, вы просто распаковываете эту строку байтов.
Для маринования в Python мы будем использовать модуль pickle
. Как указано в документации:
Модуль pickle реализует двоичные протоколы для сериализации и десериализации структуры объекта Python. «Pickling» — это процесс, посредством которого иерархия объектов Python преобразуется в поток байтов, а «unpickling» — обратная операция, в результате которой поток байтов (из двоичного файла или объекта, подобного байту) преобразуется обратно в иерархию объектов. Маринование (и расслоение) также известно как «сериализация», «сортировка» или «выравнивание»; однако во избежание путаницы здесь используются термины «травление» и «расслоение».
Модуль pickle
позволяет нам хранить практически любой объект Python непосредственно в файле или строке без необходимости выполнять какие-либо преобразования. На самом деле модуль pickle
выполняет так называемую сериализацию объектов. преобразование объектов в строки байтов и из них. Выбираемый объект будет сериализован в поток байтов, который может быть записан, например, в файл, и восстановлен позднее.
Установка pickle
Модуль pickle
фактически поставляется уже в комплекте с вашей установкой Python. Чтобы получить список установленных модулей, вы можете ввести в командной строке Python следующую команду: help('modules')
.
Поэтому все, что вам нужно сделать для работы с модулем pickle
— это import pickle
!
Создание файла Pickle
Начиная с этого раздела, мы рассмотрим некоторые примеры травления, чтобы лучше понять концепцию. Давайте начнем с создания файла pickle из объекта. Нашим объектом здесь будет список todo
мы создали в руководстве по спискам Python .
1
|
todo = [‘write blog post’, ‘reply to email’, ‘read in a book’]
|
Чтобы выбрать наш список объектов ( todo
), мы можем сделать следующее:
1
2
3
4
5
|
import pickle
todo = [‘write blog post’, ‘reply to email’, ‘read in a book’]
pickle_file = file(‘todo.pickle’, ‘w’)
pickle.dump(todo, pickle_file)
|
Обратите внимание, что мы сделали import pickle
чтобы иметь возможность использовать модуль pickle
. Мы также создали файл pickle для хранения засоленного объекта, а именно todo.pickle
. Функция dump
записывает маринованное представление todo
в открытый объект файла pickle_file
. Другими словами, функция dump
здесь имеет два аргумента: объект для выбора, который является списком todo
, и файловый объект, в который мы хотим записать параметр, который является todo.pickle
.
Открепление (восстановление) маринованных данных
Скажем, что мы хотели бы распаковать (восстановить) маринованные данные; в нашем случае это список todo
. Для этого мы можем написать следующий скрипт:
1
2
3
4
5
|
import pickle
pickle_file = file(‘todo.pickle’)
todo = pickle.load(pickle_file)
print(todo)
|
Приведенный выше скрипт выведет элементы списка задач:
1
|
[‘write blog post’, ‘reply to email’, ‘read in a book’]
|
Как упомянуто в документации, функция load(file)
делает следующее:
Считайте строку из открытого файла объектного файла и интерпретируйте ее как поток данных для восстановления, восстанавливая и возвращая исходную иерархию объектов. Это эквивалентно
Unpickler(file).load()
.
Соленья как струны
В приведенном выше разделе мы увидели, как мы можем записывать / загружать соленья в / из файла. Это не обязательно, однако. Я имею в виду, что если мы хотим писать / загружать соленья, нам не всегда нужно иметь дело с файлами — вместо этого мы можем работать с солями как строками. Таким образом, мы можем сделать следующее:
1
2
3
4
5
|
import pickle
todo = [‘write blog post’, ‘reply to email’, ‘read in a book’]
pickled_data = pickle.dumps(todo)
print(pickled_data)
|
Обратите внимание, что мы использовали функцию dumps
(с символом «s» в конце), которая, согласно документации:
Возвращает маринованное представление объекта в виде строки вместо записи в файл.
Чтобы восстановить вышеупомянутые данные, мы можем использовать функцию loads(string)
следующим образом:
1
|
restored_data = pickle.loads(pickled_data)
|
Согласно документации, функция load работает так:
Считывает иерархию засоленных объектов из строки. Символы в строке после представления засоленного объекта игнорируются.
Мариновать больше, чем один предмет
В приведенных выше примерах мы имели дело с травлением и восстановлением (загрузкой) только одного объекта за раз. В этом разделе я покажу вам, как мы можем сделать это для более чем одного объекта. Скажем, у нас есть следующие объекты:
1
2
3
4
|
name = ‘Abder’
website = ‘https://abder.io’
english_french = {‘paper’:’papier’, ‘pen’:’stylo’, ‘car’:’voiture’} # dictionary
tup = (31,’abder’,4.0) # tuple
|
Если вы хотите узнать больше о словарях и кортежах Python, проверьте следующие учебники:
Мы можем просто выбрать вышеупомянутые объекты, запустив ряд функций dump
, следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
|
import pickle
name = ‘Abder’
website = ‘http://abder.io’
english_french = {‘paper’:’papier’, ‘pen’:’stylo’, ‘car’:’voiture’} # dictionary
tup = (31,’abder’,4.0) # tuple
pickled_file = open(‘pickled_file.pickle’, ‘w’)
pickle.dump(name, pickled_file)
pickle.dump(website, pickled_file)
pickle.dump(english_french, pickled_file)
pickle.dump(tup, pickled_file)
|
Это приведет к засечке всех четырех объектов в файле pickled_file.pickle
.
Есть еще один замечательный способ написания вышеуказанного скрипта с использованием класса Pickler
в модуле pickle
:
01
02
03
04
05
06
07
08
09
10
|
from pickle import Pickler
name = ‘Abder’
website = ‘http://abder.io’
english_french = {‘paper’:’papier’, ‘pen’:’stylo’, ‘car’:’voiture’} # dictionary
tup = (31,’abder’,4.0) # tuple
pickled_file = open(‘pickled_file.pickle’, ‘w’)
p = Pickler(pickled_file)
p.dump(name);
|
Чтобы восстановить (загрузить) исходные данные, мы можем просто использовать более одной функции load
, как показано ниже:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
import pickle
pickled_file = open(‘pickled_file.pickle’)
name = pickle.load(pickled_file)
website = pickle.load(pickled_file)
english_french = pickle.load(pickled_file)
tup = pickle.load(pickled_file)
print(‘Name: ‘)
print(name)
print(‘Website:’)
print(website)
print(‘Englsh to French:’)
print(english_french)
print(‘Tuple data:’)
print(tup)
|
Вывод вышеприведенного скрипта:
1
2
3
4
5
6
7
8
|
Name:
Abder
Website:
http://abder.io
Englsh to French:
{‘car’: ‘voiture’, ‘pen’: ‘stylo’, ‘paper’: ‘papier’}
Tuple data:
(31, ‘abder’, 4.0)
|
Как и в случае с классом Pickler
, мы можем переписать приведенный выше скрипт, используя класс Unpickler
в модуле pickle
, следующим образом:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
from pickle import Unpickler
pickled_file = open(‘pickled_file.pickle’)
u = Unpickler(pickled_file)
name = u.load();
print(‘Name: ‘)
print(name)
print(‘Website:’)
print(website)
print(‘English to French:’)
print(english_french)
print(‘Tuple data:’)
print(tup)
|
Обратите внимание, что переменные должны быть записаны и прочитаны в том же порядке, чтобы получить желаемый результат. Чтобы избежать каких-либо проблем здесь, мы можем использовать словарь для управления данными, как показано ниже:
01
02
03
04
05
06
07
08
09
10
|
import pickle
name = ‘Abder’
website = ‘http://abder.io’
english_french = {‘paper’:’papier’, ‘pen’:’stylo’, ‘car’:’voiture’} # dictionary
tup = (31,’abder’,4.0) # tuple
pickled_file = open(‘pickled_file.pickle’, ‘w’)
data = {‘name’:name, ‘website’:website,’english_french_dictionary’:english_french,’tuple’:tup }
pickle.dump(data, pickled_file)
|
Чтобы восстановить (загрузить) данные, выбранные в приведенном выше сценарии, мы можем сделать следующее:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
import pickle
pickled_file = open(‘pickled_file.pickle’)
data = pickle.load(pickled_file)
name = data[‘name’]
website = data[‘website’]
english_french = data[‘english_french_dictionary’]
tup = data[‘tuple’]
print(‘Name: ‘)
print(name)
print(‘Website:’)
print(website)
print(‘English to French:’)
print(english_french)
print(‘Tuple data:’)
print(tup)
|
Соленья и панды
Ну, это кажется интересной комбинацией. Если вам интересно, что такое панды, вы можете узнать о них больше из учебника Введение в панды . Основная структура данных pandas
называется DataFrame
, DataFrame
структура данных, состоящая из упорядоченных столбцов и строк.
Давайте возьмем пример DataFrame
из учебника Pandas :
1
2
3
4
5
|
import pandas as pd
name_age = {‘Name’ : [‘Ali’, ‘Bill’, ‘David’, ‘Hany’, ‘Ibtisam’],
‘Age’ : [32, 55, 20, 43, 30]}
data_frame = pd.DataFrame(name_age)
|
Чтобы DataFrame
наш DataFrame
, мы можем использовать to_pickle()
следующим образом:
1
|
data_frame.to_pickle(‘my_panda.pickle’)
|
Чтобы восстановить (загрузить) маринованный DataFrame
, мы можем использовать read_pickle()
следующим образом:
1
|
restore_data_frame = pd.read_pickle(‘my_panda.pickle’)
|
Объединяя то, что мы упомянули в этом разделе, все вместе, вот как выглядит скрипт, который выбирает и загружает объект pandas:
01
02
03
04
05
06
07
08
09
10
11
|
import pandas as pd
name_age = {‘Name’ : [‘Ali’, ‘Bill’, ‘David’, ‘Hany’, ‘Ibtisam’],
‘Age’ : [32, 55, 20, 43, 30]}
data_frame = pd.DataFrame(name_age)
data_frame.to_pickle(‘my_panda.pickle’)
restore_data_frame = pd.read_pickle(‘my_panda.pickle’)
print(restore_data_frame)
|
Вывод
В этом уроке я рассмотрел интересный модуль, называемый pickle
. Мы видели, как легко этот модуль позволяет нам хранить объекты Python для различных целей, таких как использование объекта с другой программой Python, передача объекта по сети, сохранение объекта для последующего использования и т. Д. Мы можем просто выбрать объект Python и откройте (загрузите) его, когда мы хотим восстановить исходный объект.
Не стесняйтесь, чтобы увидеть, что у нас есть в наличии для продажи и для изучения на рынке , и не стесняйтесь задавать любые вопросы и предоставить свой ценный отзыв, используя канал ниже.