В Python есть процесс сериализации, называемый pickle, который может реализовать взаимное преобразование между любым объектом и текстом, а также может реализовать взаимное преобразование между любым объектом и двоичным файлом. То есть pickle может хранить и восстанавливать объекты Python.
Стоит отметить, что pickle является стандартным модулем языка python.Библиотека pickle уже установлена при установке python, поэтому ее не нужно устанавливать отдельно.Используйте import, чтобы импортировать ее в программу, и ее можно использовать напрямую .
Модуль pickle предоставляет нам следующие 4 функции:
- dumps(): сериализовать объекты в Python в двоичные объекты и вернуть;
- load(): считывает заданные данные двоичного объекта и преобразует их в объект Python;
- dump(): сериализовать объекты в Python в двоичные объекты и записывать их в файлы;
- load(): прочитать указанный файл сериализованных данных и вернуть объект.
Вышеупомянутые четыре функции можно разделить на две категории, среди которых дамп и загрузка реализуют взаимное преобразование между объектами Python в памяти и двоичными файлами; дамп и загрузка реализуют взаимное преобразование между объектами Python на основе файлов и двоичными файлами.
функция pickle.dumps()
Эта функция используется для преобразования объекта Python в двоичный объект, и ее синтаксис выглядит следующим образом:
dumps(obj, protocol=None, *, fix_imports=True)
Значение каждого параметра в этом формате:
- obj: объект Python для преобразования;
- протокол: протокол транскодирования pickle, значения 0, 1, 2, 3 и 4, где 0, 1 и 2 соответствуют более ранним версиям Python, а 3 и 4 соответствуют Python 3.x и более поздним версиям. версии. Если не указано, по умолчанию 3.
- Другие параметры: параметры, зарезервированные для совместимости с версиями Python 2.x, можно игнорировать в Python 3.x.
【пример 1】
import pickle
tup1 = ('I love Python', {1,2,3}, None)
#使用 dumps() 函数将 tup1 转成 p1
p1 = pickle.dumps(tup1)
print(p1)
Результат:
b'\x80\x03X\r\x00\x00\x00I love Pythonq\x00cbuiltins\nset\nq\x01]q\x02(K\x01K\x02K\x03e\x85q\x03Rq\x04N\x87q\x05.'
функция pickle.loads()
Эта функция используется для преобразования двоичного объекта в объект Python, и ее основной формат выглядит следующим образом:
loads(data, *, fix_imports=True, encoding='ASCII', errors='strict')
Среди них параметр данных представляет двоичный объект, который необходимо преобразовать, а другие параметры зарезервированы для совместимости с версией Python 2.x и могут быть проигнорированы.
[Пример 2] На основе примера 1 десериализуйте объект p1 в объект Python.
import pickle
tup1 = ('I love Python', {1,2,3}, None)
p1 = pickle.dumps(tup1)
#使用 loads() 函数将 p1 转成 Python 对象
t2 = pickle.loads(p1)
print(t2)
Текущий результат:
('I love Python', {1, 2, 3}, None)
Обратите внимание, что при использовании функции load() для десериализации двоичного объекта в объект Python протокол транскодирования распознается автоматически, поэтому нет необходимости передавать протокол транскодирования в качестве параметра. Кроме того, когда количество байтов двоичного объекта, который необходимо преобразовать, превышает количество байтов Python-объекта pickle, дополнительные байты игнорируются.
функция pickle.dump()
Эта функция используется для преобразования объектов Python в двоичные файлы, и ее основной формат синтаксиса:
dump (obj, file,protocol=None, *, fix mports=True)
Конкретное значение каждого параметра следующее:
- obj: объект Python для преобразования.
- файл: преобразование в указанный двоичный файл, для чего требуется, чтобы файл работал в режиме открытия "wb".
- протокол: Значение параметра протокола в функции dumps() точно такое же, поэтому описание здесь повторяться не будет.
- Другие параметры: параметры, зарезервированные для совместимости с предыдущими версиями Python 2.x, можно игнорировать.
[Пример 3] Преобразование кортежа tup1 в двоичный объектный файл.
import pickle
tup1 = ('I love Python', {1,2,3}, None)
#使用 dumps() 函数将 tup1 转成 p1
with open ("a.txt", 'wb') as f: #打开文件
pickle.dump(tup1, f) #用 dump 函数将 Python 对象转成二进制对象文件
После запуска этой программы файл .txt будет сгенерирован в каталоге того же уровня, что и файл программы, но, поскольку его содержимое представляет собой двоичные данные, вы увидите искаженные символы при непосредственном его открытии.
функция pickle.load()
Эта функция соответствует функции dump() и используется для преобразования двоичных объектных файлов в объекты Python. Основной синтаксис этой функции:
load(file, *, fix_imports=True, encoding='ASCII', errors='strict')
Среди них параметр file указывает двоичный объектный файл, который необходимо преобразовать (файл должен работать в режиме открытия «rb»), а другие параметры зарезервированы для совместимости с версией Python 2.x и могут быть проигнорированы.
[Пример 4] Преобразуйте объект двоичного файла a.txt, преобразованный в примере 3, в объект Python.
import pickle
tup1 = ('I love Python', {1,2,3}, None)
#使用 dumps() 函数将 tup1 转成 p1
with open ("a.txt", 'wb') as f: #打开文件
pickle.dump(tup1, f) #用 dump 函数将 Python 对象转成二进制对象文件
with open ("a.txt", 'rb') as f: #打开文件
t3 = pickle.load(f) #将二进制文件对象转换成 Python 对象
print(t3)
Текущий результат:
('I love Python', {1, 2, 3}, None)
Суммировать
Кажущийся мощным модуль pickle на самом деле имеет свои недостатки, то есть pickle не поддерживает параллельный доступ к постоянным объектам.В сложной системной среде, особенно при чтении массивных данных, использование pickle сделает ввод-вывод всей системы.Производительность чтения становится узким местом. В этом случае можно использовать ZODB.
ZODB — это надежная, многопользовательская и объектно-ориентированная система баз данных, предназначенная для хранения объектных данных на языке Python, способная хранить и управлять произвольно сложными объектами Python, а также поддерживать транзакционные операции и управление параллелизмом. Кроме того, ZODB также реализован на основе операции сериализации Python, поэтому для эффективного использования ZODB необходимо сначала изучить pickle.