Статьи

Соленья питона

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

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

Для маринования в Python мы будем использовать модуль pickle . Как указано в документации:

Модуль pickle реализует двоичные протоколы для сериализации и десериализации структуры объекта Python. «Pickling» — это процесс, посредством которого иерархия объектов Python преобразуется в поток байтов, а «unpickling» — обратная операция, в результате которой поток байтов (из двоичного файла или объекта, подобного байту) преобразуется обратно в иерархию объектов. Маринование (и расслоение) также известно как «сериализация», «сортировка» или «выравнивание»; однако во избежание путаницы здесь используются термины «травление» и «расслоение».

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

Модуль pickle фактически поставляется уже в комплекте с вашей установкой Python. Чтобы получить список установленных модулей, вы можете ввести в командной строке Python следующую команду: help('modules') .

Поэтому все, что вам нужно сделать для работы с модулем pickle — это import 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 и откройте (загрузите) его, когда мы хотим восстановить исходный объект.

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