- Python. Модуль pickle. Сериализация объектов. Примеры использования для записи/чтения информации из бинарных файлов
- Модуль pickle . Сериализация объектов. Примеры использования для записи/чтения информации из бинарных файлов
- Связанные темы
- Консервация объектов в Python
- Преамбула
- Основы
- Сохранение объектов в файл — Модуль pickle Python
Python. Модуль pickle. Сериализация объектов. Примеры использования для записи/чтения информации из бинарных файлов
Модуль pickle . Сериализация объектов. Примеры использования для записи/чтения информации из бинарных файлов
Поиск на других ресурсах:
1. Модуль pickle . Сериализация/десериализация объектов. Назначение
Модуль pickle позволяет сохранять в файлах любые объекты Python без использования лишних преобразований. В целом, модуль pickle реализует двоичный протокол для сериализации и десериализации объектов. Под сериализацией понимается преобразование объектов в строку байт. Десериализация предусматривает обратную операцию конвертирования потока байт в исходный объект.
С помощью модуля pickle можно:
- реализовывать преобразование иерархии объектов в поток байтов (pickling). Потоком байтов может быть, например, файл;
- выполнять обратное преобразование потока байтов в иерархию объектов (unpickling). Поток байтов может быть получен с двоичного файла или байтового объекта.
2. Использование модуля pickle . Методы dump() , load()
Модуль pickle используется для работы с объектами типа bytes и обеспечивает сериализацию объектов.
Чтобы использовать методы модуля pickle , предварительно его нужно подключить
Чтобы записать объект в файл нужно использовать метод dump() . Простейший вызов метода выглядит следующим образом
pickle.dump(obj, file, protocol = None, *, fix_imports = True)
- obj – сохраняемый объект. Этим объектом может быть число, строка, список, кортеж, множество, словарь или другой объект;
- file – бинарный файл, в котором объект может быть сохранен.
Для чтения объекта из файла используется метод load() . В простейшем случае вызов метода load() следующий
здесь obj – объект, получаемый из файла file .
3. Чтение/запись списка, который содержит вещественные числа. Пример
С помощью методов dump() и load() модуля pickle можно сохранять разнообразные списки в файлах. При этом не нужно делать дополнительных преобразований.
# Модуль pickle. Работа с файлами # Запись/чтение списка, содержащего вещественные числа # 1. Исходный список L = [ 2.85, 3.35, -1.77, 9.2 ] # 2. Подключить модуль pickle import pickle # 3. Запись списка в бинарный файл # 3.1. Открыть файл для записи f = open('myfile.bin', 'wb') # 3.2. Сохранить список L в файле f pickle.dump(L, f) # 3.3. Закрыть файл f.close() # 4. Чтение списка из файла # 4.1. Открыть файл для чтения f = open('myfile.bin', 'rb') # 4.2. Считать список из файла L2 = pickle.load(f) # 4.3. Вывести список L2 print('L2 = ', L2) # L2 = [2.85, 3.35, -1.77, 9.2] # 4.4. Закрыть файл f.close()
Результат выполнения программы
4. Запись/чтение кортежа, содержащего строки. Пример
Запись и чтение кортежа не отличается от записи и чтения списка или любого иного объекта.
# Модуль pickle. Работа с бинарными файлами # Запись/чтение кортежа # 1. Заданный кортеж строк T = ( 'abc', 'abcd', 'cde', 'fgh hij' ) # 2. Подключить модуль pickle import pickle # 3. Сохранить кортеж в файле # 3.1. Открыть файл для записи f = open('myfile.bin', 'wb') # 3.2. Сохранить кортеж T в файле f pickle.dump(T, f) # 3.3. Закрыть файл f.close() # 4. Чтение кортежа из файла # 4.1. Открыть файл для чтения f = open('myfile.bin', 'rb') # 4.2. Считать кортеж из файла T2 = pickle.load(f) # 4.3. Закрыть файл f.close() # 5. Вывести кортеж print('T2 = ', T2) # T2 = ('abc', 'abcd', 'cde', 'fgh hij')
Результат выполнения программы
5. Чтение/запись множества с разнотипными данными. Пример
# Модуль pickle. Работа с бинарными файлами # Запись/чтение множества # 1. Заданное множество разнотипных объектов M = < 2, 5.85, True, 'abcde' > # 2. Подключить модуль pickle import pickle # 3. Сохранить множество в файле # 3.1. Открыть файл для записи f = open('myfile.bin', 'wb') # 3.2. Сохранить множество M в файле f pickle.dump(M, f) # 3.3. Закрыть файл f.close() # 4. Чтение множества из файла # 4.1. Открыть файл для чтения f = open('myfile.bin', 'rb') # 4.2. Прочитать множество из файла M2 = pickle.load(f) # 4.3. Закрыть файл f.close() # 5. Вывести множество print('M2 = ', M2) # M2 =
Результат работы программы
6. Запись/чтение разнотипных объектов: списка, кортежа и словаря. Пример
В данном примере продемонстрированы возможности модуля pickle для сохранения объектов разных типов: списка, кортежа и словаря.
# Модуль pickle. Работа с файлами # Запись/чтение разнотипных объектов # 1. Входные данные # 1.1. Исходный список L = [ True, 'abc', 2.5, 100 ] # 1.2. Исходный кортеж T = ( 2.55, False, 'Hello' ) # 1.3. Словарь с разнотипными объектами D = < 1:'abc', 2:2.55, 'Three':False > # 2. Подключить модуль pickle import pickle # 3. Запись данных в бинарный файл # 3.1. Открыть файл для записи f = open('myfile.bin', 'wb') # 3.2. Сохранить список L в файл f pickle.dump(L, f) # 3.3. Сохранить кортеж в файл pickle.dump(T, f) # 3.4. Сохранить словарь D в файле f pickle.dump(D, f) # 3.5. Закрыть файл f.close() # 4. Чтение списка из файла # 4.1. Открыть файл для чтения f = open('myfile.bin', 'rb') # 4.2. Прочитать список из файла L2 = pickle.load(f) # 4.3. Прочитать кортеж из файла T2 = pickle.load(f) # 4.4. Прочитать словарь из файла D2 = pickle.load(f) # 4.5. Вывести список, кортеж и словарь print('L2 = ', L2) # L2 = [True, 'abc', 2.5, 100] print('T2 = ', T2) # T2 = (2.55, False, 'Hello') print('D2 = ', D2) # D2 = # 4.6. Закрыть файл f.close()
Связанные темы
Консервация объектов в Python
В определенный момент любому Питон-программисту понадобится запаковать какой-то объект и спрятать его до лучших времен. Скажем, в config-файл. Или передать через сокет. Как это сделать? Разумеется, можно написать небольшой класс, который будет генерировать и парсить XML-код (кстати, следующая статья как раз будет об этом), но это — слишком большая морока.
Преамбула
Pickle (англ. консервировать, мариновать) — модуль сериализации и десериализации объектов в Питоне для последующей их передачи.
- None, True, False
- Строки (обычные или Юникод)
- Стандартные числовые типы данных
- Словари, списки, кортежи
- Функции
- Классы
Сами создатели Питона в официальной документации советуют использовать cPickle, а чтобы долго не модифицировать программу, можно подключить cPickle так:
Основы
Как использовать консервацию объектов? У вас есть два варианта: либо консервировать объект в строку (которую можно передать через сокет, например) либо сразу в файл.
- Версия 0, стандартный ASCII протокол. Его следует использовать только для совместимости с ранними версиями Питона.
- Версия 1 — примерно то же самое, используется для совместимости со старыми версиями Питона.
- Версия 2 впервые внедрена в версии 2.3, она лучше всего запаковывает объекты, написанные в современном синтаксисе, я рекомендую использовать именно её.
import cPickle as pickle
obj =
output = pickle.dumps(obj, 2)
Как видите, ничего сложного, объект готов к отправке.
Теперь нужно его распаковать назад. Это еще проще:
Протокол консервирования определяется автоматически.
Давайте попробуем запаковать объект в файл.
import cPickle as pickle
obj =
output = open(‘data.pkl’, ‘wb’)
pickle.dump(obj, output, 2)
output.close()
Обратите внимание, что режим записи в файл должен обязательно быть wb, то есть перезапись файла в бинарном режиме. Для чтения режим должен быть rb:
import cPickle as pickle
input = open(‘data.pkl’, ‘rb’)
obj = pickle.load(input)
input.close()
Спасибо за внимание. В следующий раз я бы хотел поговорить об особенностях создания и парсинга XML-данных в Питоне.
Сохранение объектов в файл — Модуль pickle Python
20 января 2014 г.
Archy
Просмотров: 24649
RSS
1
pickle, 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 ['\xd0\xa1\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb0', (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 (['\xd0\xa1\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb0', (2, 3)], (5, 6)) >>> f.close()
Модуль pickle позволяет также преобразовать объект в строку и восстановить объект из строки. Для этого предназначены следующие функции:
dumps(, [, ]) — производит сериализацию объекта и возвращает строку специального формата. Формат этой строки зависит от указанного протокола (число от 0 до 2). В качестве примера выведем результат преобразования в различных протоколах.
>>> obj = ["Строка", (2, 3)] >>> pickle.dumps(obj) "(lp0\nS'\\xd0\\xa1\\xd1\\x82\\xd1\\x80\\xd0\\xbe\\xd0\\xba\\xd0\\xb0'\np1\na(I2\nI3\ntp2\na." >>> pickle.dumps(obj, 0) # Протокол 0 "(lp0\nS'\\xd0\\xa1\\xd1\\x82\\xd1\\x80\\xd0\\xbe\\xd0\\xba\\xd0\\xb0'\np1\na(I2\nI3\ntp2\na." >>> pickle.dumps(obj, 1) # Протокол 0 ']q\x00(U\x0c\xd0\xa1\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb0q\x01(K\x02K\x03tq\x02e.' >>> pickle.dumps(obj, 2) # Протокол 2 '\x80\x02]q\x00(U\x0c\xd0\xa1\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb0q\x01K\x02K\x03\x86q\x02e.'