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

Загрузка данных из фала pickle.




Загрузка данных из фала pickle.

Теперь переключитесь во вторую консоль Python — т. е. не в ту где вы создали словарь entry.

> > > shell ①
2
> > > entry ②
Traceback (most recent call last):
File " < stdin> ", line 1, in < module>
NameError: name 'entry' is not defined
> > > import pickle
> > > with open('entry. pickle', 'rb') as f: ③
... entry = pickle. load(f) ④
...
> > > entry ⑤
{'comments_link': None,
'internal_id': b'\xDE\xD5\xB4\xF8',
'title': 'Dive into history, 2009 edition',
'tags': ('diveintopython', 'docbook', 'html'),
'article_link':
'http: //diveintomark. org/archives/2009/03/27/dive-into-history-2009-edition',
'published_date': time. struct_time(tm_year=2009, tm_mon=3, tm_mday=27, tm_hour=22, tm_min=20, tm_sec=42, tm_wday=4, tm_yday=86, tm_isdst=-1),
'published': True}

① Это вторая консоль Python

② Здесь не определена переменная entry. Вы определяли переменную entry в первой консоли Python, но это полностью отличное окружение со своим собственным состоянием.

③ Откроем entry. pickle файл, который вы создали в первой консоли Python. Модуль pickle использует двоичный формат представления данных, поэтому вам всегда нужно открывать файл в двоичном режиме.

④ Функция pickle. load() принимает на вход поток, читает сериализованные данные из потока, создает новый объект Python, восстанавливает сериализованные данные в новый объект Python, и возвращает новый объект Python.

⑤ Теперь переменная entry — это словарь со знакомыми ключами и значениями.

Результат цикла pickle. dump()/pickle. load() это новая структура данных эквивалентная оригинальной структуре данных.

> > > shell ①
1
> > > with open('entry. pickle', 'rb') as f: ②
... entry2 = pickle. load(f) ③
...
> > > entry2 == entry ④
True
> > > entry2 is entry ⑤
False
> > > entry2['tags'] ⑥
('diveintopython', 'docbook', 'html')
> > > entry2['internal_id']
b'\xDE\xD5\xB4\xF8'

① Переключитесь обратно в первую консоль Python.

② Откройте entry. pickle файл

③ Загрузите сериализованные данные в новую переменную entry2

④ Python подтверждает, что эти два словаря(entry и entry2) эквивалентны. В этой консоли вы создали entry с нуля, начиная с пустого словаря вручную присваивая значения ключам. Вы сериализовали этот словарь и сохранили в файле entry. pickle. Теперь вы считали сериализованные данные из этого фала и создали совершенную копию оригинальной структуры.

⑤ Эквивалентность не значит идентичности. Я сказал, что вы создали _идеальную копию_ оригинальной структуры данных, и это правда. Но это все же копия.

⑥ По причинам которые станут ясны в дальнейшем, я хочу указать, что значения ключа 'tags' это кортеж, и значение 'internal_id' это объект bytes.

Много статей о модуле Pickle ссылаются на cPickle. В Python 2 существует две реализации модуля pickle одна написана на чистом Python а другая на C(но все же вызываема из Python). В Python 3 эти два модуля были объеденены поэтому вам следует всегда использовать import pickle. Вам могут быть плезны эти статьи но следует игнорировать устаревшую информацию о cPickle.

Используем Pickle без файлов

Пример из предыдущей секции показал как сериализовать объект напрямую в файл на диске. Но что если он вам не нужен или вы не хотели использовать файл? Вы можете сериализовать в объект bytes в памяти.

> > > shell
1
> > > b = pickle. dumps(entry) ①
> > > type(b) ②
< class 'bytes'>
> > > entry3 = pickle. loads(b) ③
> > > entry3 == entry ④
True

① Функция pickle. dumps() (обратите внимание на 's' в конце имени функции) делает ту же самую сериализацию что и функция pickle. dump(). Вместо того чтобы принимать на вход поток и писать сериализованные данные на диск, она просто возвращает сериализованные данные

② Поскольку протокол pickle использует двоичный формат данных, функция pickle. dumps() возвращает объект типа bytes.

③ Функция pickle. loads() (снова заметьте 's' в конце имени функции) делает ту же самую десериализацию что и функция pickle. load(). Но вместо того чтобы принимать на вход поток и читать сериализованные данные из файла, она принимает на вход объект типа bytes содержащий сериализованные данные, такие как возвращаемые функцией pickle. dumps()

④ Конечный результат таков же: идеальная копия оригинального словаря.

Байты и строки снова вздымают свои уродливые головы

Протокол pickle существует уже много лет, и он развивался вместе с тем как развивался сам Python. Сейчас существует четыре различных версии протокола pickle.

  • Python 1. x породил две версии протокола, основанный на тексте формат (версия 0) и двоичный формат (версия 1)
  • Python 2. 3 ввел новый протокол pickle(версия 2) для того чтобы поддерживать новый функционал в классах Python. Он двоичный.
  • Python 3. 0 ввел еще один протокол pickle(версия 3) с полной поддержкой объектов типа bytes и массивов байт. Он так же двоичный.

Вау смотрите, разница между строками и байтами снова вздымает свою уродливую голову. (Если вы удивлены, вы не уделяли достаточно внимания. ) На практике это значит, что в то время, как Python 3 может читать данные сохраненные при помощи протокола версии 2, Python 2 не может читать данные сохраненные при помощи протокола версии 3.

Поделиться:





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



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