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

Материалы для дальнейшего чтения




Материалы для дальнейшего чтения

XML на Википедии

The ElementTree XML API(англ. )

Elements and Element Trees - Элементы и деревья элементов(англ. )

XPath Support in ElementTree - Поддержка XPath в ElementTree(англ. )

The ElementTree iterparse Function - Функция iterparse в ElementTree(англ. )

lxml(англ. )

Parsing XML and HTML with lxml - обработка XML и HTML в lxml(англ. )

XPath and XSLT with lxml - XPath и XSLT в lxml(англ. )

xmlwitch(англ. )

Сериализация объектов Python

 

Погружение

С первого взгляда, идея сериализации проста. У вас есть структура данных в памяти, которую вы хотите сохранить, использовать повторно, или отправить кому либо. Как вам это сделать? Это зависит от того как вы ее сохраните, как вы ее хотите использовать, и кому вы ее хотите отправить. Многие игры позволяют вам сохранять ваш прогресс перед выходом и возобновлять игру после запуска. (Вообще, многие неигровые приложения также позволяют это делать). В этом случае, структура, которая хранит ваш прогресс в игре, должна быть сохранена на диске, когда вы закрываете игру, и загружена с диска, когда вы ее запускаете. Данные предназначены только для использования той же программой что и создала их, никогда не посылаются по сети, и никогда не читаются ничем кроме программы их создавшей. Поэтому проблемы совместимости ограничены тем, чтобы более поздние версии программы могли читать данные созданные ранними версиями.

Для таких случаев модуль pickle идеален. Это часть стандартной библиотеки Python, поэтому он всегда доступен. Он быстрый, большая часть написана на C, как и сам интерпретатор Python. Он может сохранять совершенно произвольные комплексные структуры данных Python.

Что может сохранять модуль pickle?

  • Все встроенные типы данных Python: тип boolean, Integer, числа с плавающей точкой, комплексные числа, строки, объекты bytes, массивы байт, и None.
  • Списки, кортежи, словари и множества, содержащие любую комбинацию встроенных типов данных
  • Списки, кортежи, словари и множества, содержащие любую комбинацию списков, кортежей, словарей и множеств содержащий любую комбинацию встроенных типов данных (и так далее, вплоть до максимального уровня вложенности, который поддерживает Python).
  • Функции, классы и экземпляры классов (с caveats).

Если для вас этого мало, то модуль pickle еще и расширяем. Если вам интересна эта возможность, то смотрите ссылки в разделе «Дальнейшее чтение» в конце этой главы.

Маленькая заметка о примерах в этой главе.

Эта часть повествует о двух Python консолях. Все примеры в этой главе — часть одной большей истории. Вам нужно будет переключаться назад и вперед между двумя консолями для демонстрации модулей pickle и json.

Для того чтобы не запутаться откройте консоль Python и определите следующую переменную:

> > > shell = 1

Оставьте это окно открытым. И откройте еще одну консоль Python и определите следующую переменную:

> > > shell = 2

В этой главе я буду использовать переменную shell для того чтобы показать какую именно консоль Python я использую в каждом примере.

Сохранение данных в файл Pickle.

Модуль Pickle работает со структурами данных. Давайте создадим одну.

> > > shell 1 ①
> > > entry = {} ②
> > > entry['title'] = 'Dive into history, 2009 edition'
> > > entry['article_link'] = 'http: //diveintomark. org/archives/2009/03/27/dive-into-history-2009-edition'
> > > entry['comments_link'] = None
> > > entry['internal_id'] = b'\xDE\xD5\xB4\xF8'
> > > entry['tags'] = ('diveintopython', 'docbook', 'html')
> > > entry['published'] = True
> > > import time
> > > entry['published_date'] = time. strptime('Fri Mar 27 22: 20: 42 2009') ③
> > > entry['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)

① Все дальнейшее происходит в консоли Python #1.

② Идея в том чтобы создать словарь, который будет представлять что-нибудь полезное, например элемент рассылки Atom. Также я хочу быть уверенным, что он содержит несколько разных типов данных, чтобы раскрыть возможности модуля pickle. Не вчитывайтесь слишком сильно в эти переменные.

③ Модуль time содержит структуру данных (struct_time) для представления момента времени (вплоть до миллисекунд) и функции для работы с этими структурами. Функция strptime() принимает на вход форматированную строку и преобразует ее в struct_time. Эта строка в стандартном формате, но вы можете контролировать ее при помощи кодов форматирования. Для более подробного описания загляните в модуль time.

Теперь у нас есть замечательный словарь. Давайте сохраним его в файл.

> > > shell ①
1
> > > import pickle
> > > with open('entry. pickle', 'wb') as f: ②
... pickle. dump(entry, f) ③
...

① Мы все еще в первой консоли

② Используйте функцию open() для того чтобы открыть файл. Установим режим работы с файлом в 'wb' для того чтобы открыть файл для записи в двоичном режиме. Обернем его в конструкцию with для того чтобы быть уверенным в том что файл закроется автоматически, когда вы завершите работу с ним.

③ Функция dump() модуля pickle принимает сериализуемую структуру данных Python, сериализует ее в двоичный, Python-зависимый формат использует последнюю версию протокола pickle и сохраняет ее в открытый файл.

Последнее предложение было очень важным.

  • Протокол pickle зависит от Python; здесь нет гарантий совместимости с другими языками. Вы возможно не сможете взять entry. pickle файл, который только что сделали и как — либо с пользой его использовать при помощи Perl, PHP, Java или любого другого языка программирования
  • Не всякая структура данных Python может быть сериализована модулем Pickle. Протокол pickle менялся несколько раз с добавлением новых типов данных в язык Python, и все еще у него есть ограничения.
  • Как результат, нет гарантии совместимости между разными версиями Python. Новые версии Python поддерживают старые форматы сериализации, но старые версии Python не поддерживают новые форматы (поскольку не поддерживают новые форматы данных)
  • Пока вы не укажете иное, функции модуля pickle будут использовать последнюю версию протокола pickle. Это сделано для уверенности в том, что вы имеете наибольшую гибкость в типах данных, которые вы можете сериализовать, но это также значит, что результирующий файл будет невозможно прочитать при помощи старых версий Python, которые не поддерживают последнюю версию протокола pickle.
  • Последняя версия протокола pickle это двоичный формат. Убедитесь, что открываете файлы pickle в двоичном режиме, или данные будут повреждены при записи.
Поделиться:





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



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