Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Отладка файлов pickle. Сериализация объектов Python для чтения при помощи других языков




Отладка файлов pickle

Как выглядит протокол pickle? Давайте ненадолго отложим консоль python и взглянем в файл entry. pickle, который мы создали. Для не вооруженного взгляда он выглядит как тарабарщина.

you@localhost: ~/diveintopython3/examples$ ls -l entry. pickle
-rw-r--r-- 1 you you 358 Aug 3 13: 34 entry. pickle
you@localhost: ~/diveintopython3/examples$ cat entry. pickle
comments_linkqNXtagsqXdiveintopythonqXdocbookqXhtmlq? qX publishedq?
XlinkXJhttp: //diveintomark. org/archives/2009/03/27/dive-into-history-2009-edition
q Xpublished_dateq
ctime
struct_time
? qRqXtitleqXDive into history, 2009 editionqu.

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

> > > shell
1
> > > import pickletools
> > > with open('entry. pickle', 'rb') as f:
... pickletools. dis(f)
0: \x80 PROTO 3
2: } EMPTY_DICT
3: q BINPUT 0
5: ( MARK
6: X BINUNICODE 'published_date'
25: q BINPUT 1
27: c GLOBAL 'time struct_time'
45: q BINPUT 2
47: ( MARK
48: M BININT2 2009
51: K BININT1 3
53: K BININT1 27
55: K BININT1 22
57: K BININT1 20
59: K BININT1 42
61: K BININT1 4
63: K BININT1 86
65: J BININT -1
70: t TUPLE (MARK at 47)
71: q BINPUT 3
73: } EMPTY_DICT
74: q BINPUT 4
76: \x86 TUPLE2
77: q BINPUT 5
79: R REDUCE
80: q BINPUT 6
82: X BINUNICODE 'comments_link'
100: q BINPUT 7
102: N NONE
103: X BINUNICODE 'internal_id'
119: q BINPUT 8
121: C SHORT_BINBYTES 'Þ Õ ´ ø '
127: q BINPUT 9
129: X BINUNICODE 'tags'
138: q BINPUT 10
140: X BINUNICODE 'diveintopython'
159: q BINPUT 11
161: X BINUNICODE 'docbook'
173: q BINPUT 12
175: X BINUNICODE 'html'
184: q BINPUT 13
186: \x87 TUPLE3
187: q BINPUT 14
189: X BINUNICODE 'title'
199: q BINPUT 15
201: X BINUNICODE 'Dive into history, 2009 edition'
237: q BINPUT 16
239: X BINUNICODE 'article_link'
256: q BINPUT 17
258: X BINUNICODE 'http: //diveintomark. org/archives/2009/03/27/dive-into-history-2009-edition'
337: q BINPUT 18
339: X BINUNICODE 'published'
353: q BINPUT 19
355: \x88 NEWTRUE
356: u SETITEMS (MARK at 5)
357: . STOP
highest protocol among opcodes = 3

Самая интересная часть информации в дизассемблере находится на последней строке, потому что она включает версию протокола, при помощи которого данный файл был сохранен. Не существует явного маркера протокола pickle. Чтобы определить какую версию протокола использовали для сохранения фала Pickle, вам необходимо заглянуть в маркеры(«opcodes») внутри сохраненных данных и использовать вшитую информацию о том какие маркеры были введены, в какой версии протокола Pickle. Функция pickletools. dis() делает именно это, и она печатает результат в последней строке дизассемблированного вывода. Вот функция, которая возвращает только номер версии, без вывода данных:

import pickletools

def protocol_version(file_object):
maxproto = -1
for opcode, arg, pos in pickletools. genops(file_object):
maxproto = max(maxproto, opcode. proto)
return maxproto

И вот она же в действии:
> > > import pickleversion
> > > with open('entry. pickle', 'rb') as f:
... v = pickleversion. protocol_version(f)
> > > v
3

Сериализация объектов Python для чтения при помощи других языков

Формат данных используемый модулем pickle Python-зависимый. Он не пытается быть совместимым с другими языками программирования. Если межязыковая совместимость есть среди ваших потребностей, вам следует присмотреться к форматам сериализации. Один из таких форматов JSON. «JSON» это аббревиатура от «JavaScript Object Notation», но не позволяйте имени обмануть вас — JSON был наверняка разработан для использования многими языками программирования.

Python 3 включает модуль json в стандартную библиотеку. Как и модуль pickle, модуль json имеет функции для сериализации структур данных, сохранения сериализованных данных на диск, загрузки сериализованных данных с диска, и десереализации данных обратно в новый объект Python. Так же существует несколько важных различий. Первое, формат данных json текстовый, а не двоичный. RFC 4627 определяет формат json и то, как различные типы данных должны быть преобразованы в текст. Например, логическое значение сохраняется как пяти символьная строка 'false' или четырех символьная строка 'true'. Все значения в json регистрочувствительные.

Во — вторых, как и с любым текстовым форматом, существует проблема пробелов. JSON позволяет вставлять произвольное количество пробелов (табуляций, переводов строк, и пустых строк) между значениями. Пробелы в нем «незначащие», что значит, кодировщики JSON могут добавлять так много или так мало пробелов как захотят, и декодировщики JSON будут игнорировать пробелы между значениями. Это позволяет вам использовать красивый вывод(pretty-print) для отображения ваших данных в формате JSON, удобно отображать вложенные значения различными уровнями отступа так чтобы вы могли читать все в стандартном просмотрщике или текстовом редакторе. Модуль json в Python имеет опции красивого вывода во время кодирования данных.

В — третьих, существует многолетняя проблема кодировок. JSON хранит значения как обычный текст, но, как вы знаете, не существует таких вещей как «обычный текст». JSON должен быть сохранен в кодировке Unicode(UTF-32, UTF-16, или стандартной UTF-8), и секция 3 из RFC 4627 определяет то, как указать используемую кодировку.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...