Саммерфилд - Программирование на Python 3 (1077331), страница 58
Текст из файла (страница 58)
Мы уже использовали функцию хв1. еах захитт1з. еесаре() из модуля хв1 зах, захе(11е (для экранированияслужебныхсимволов «й», «<» и «>»). Существует также функция хв1. ззх. ззхотт1з. цоотезтт г(), которая выполняет то же действие, но дополнительно экранирует кавычки (чтобы текст можно было использовать в атрибутах тегов); обратное преобразование можно выполнить с помощью функции хв1. еах, пахот т1е. опезсаре(). В библиотеке существует еще два парсера. Модуль хв1. рагзеге.
ехрат может использоваться для работы с документами ХМ1 с применением библиотеки ехра1, при наличии этой библиотеки в системе, и модуль хв1. ет гее. Е1евептТгее может использоваться для работы с документами ХМЬ через интерфейс словарей и списков. (По умолчанию парсеры 1)ОМ и дерева элементов за кулисами сами используют парсер, использующий библиотеку ехрзт.) Порядок создания документов ХМЬ вручную, с применением модулей 1)ОМ и деревьев элементов, и парсинг с использованием парсеров 1)ОМ, ЯАХ и дерева элементов, описывается в главе 7. Пример: модуль хгтз!.етгее.Е!елзелтТгее Парсеры 1)ОМ и ЗАХ предоставляют прикладной программный интерфейс, которым пользуются опытные программисты, хорошо знающие формат ХМЬ, а модуль хв1, ет гее.
Е1евептТгее предлагает более простой и более естественный для языка Ру1)топ подход к парсингу и созданию документов ХМ1. Модуль дерева элементов совсем недавно был добавлен в стандартную библиотеку' и потому может оказаться незнакомым для некоторых читателей. Поэтому мы представим здесь очень короткий пример, чтобы можно было составить общее представление об этом модуле.
В главе 7 будет представлен более сложный пример и проведено сравнение программного кода, использующего парсеры 1)ОМ и ЗАХ. Веб-сайт организации 1чОАА (1ча1!опа! Осеап1с апс) Айповр)тег!с Ас)ш)- и!э$гаь!оп — Национальное управление по исследованию океанов и атмосферы) правительства США предоставляет самые разнообразные данные, включая файл в формате ХМЬ, в котором перечислены метео- Модуль хв1. ет гее.
Е! евепттгее был включен в стандартную библиотеку а версии Ру»)топ 2.5. 266 Глава 5. Модули рологические станции США. Файл насчитывает свыше 20000 строк и содержит сведения примерно о двух тысячах метеорологических станций. Ниже приводится типичный пример одной из записей: <Вга1!оп> <ага!!оп 1а>к803</вга11сп ы> <зга!е>КА</зга(а> <в(а11оп паве>Воз!оп, Еодап 1п1агпа11опа1 А!грег!</зга1!оп паве> <ха1 нг1>пмр,//ива!пег, дон/аа1а/снггеп1 оьз/к808. ха1</хн1 нг1> </З<а(1оп> Ь>пагу = дахр,преп(Г>1апаае).геап() гп = !с.в<г>пд10(ь(пагу.засосе("нгг8")) Функция дг!р. преп() из модуля да!р напоминает встроенную функцию преп( ), за исключением того, что она читает файлы, сжатые при помощи утилиты яэ!р (то есть с файлы с расширением .дг), просто как двоичные данные.
Нам необходимо обеспечить доступность этих данных для парсера в виде файла, поэтому мы использовали метод Ьу!ев. Вессье() для преобразования двоичных данных в строку с кодировкой символов [ТТР-8 (эта кодировка по умолчанию используется для файлов ХМЬ) и создали объект ао.51г!пд10„напоминающий файл, со строкой, вмещающей все содержимое файла ХМЬ. а Тнп данных Ьутав, стр. 344 а Тнп данных 10. 81г1пд- 10, стр. 249 ггеа = ха1.аггее е1ааапгтгаа.е1епепгтгаа() гоо1 = ггее.рагве(гп) в1а1!опз = [) Гог е1ааеп( >п 1гаа.да!>!ага!о<("Зга1>оп пана").
вгаг>опз. аррепз(а1ааапг.гах1) Здесь мы создали новый объект ха1. еггее. Е1еаеп[Тгее. Е1еаепгТгее и передали ему объект файла, откуда он будет читать содержимое файла ХМЬ, который нам требуется проанализировать. Парсер требует, чтобы ему был передан объект файла, открытого для чтения, хотя в действительности он читает его содержимое в строку объекта ао.51г!пд10. Нам требуется извлечь из файла названия метеорологических станций, и это легко сделать с помощью метода ха1.
е1гее. Е1еаеп1Тгее. Е1еаеп1Тгее.де!!1егагсг(), который возвращает итератор, выполняющий итерации по всем объектам х~п1.е!гее Е1еаеп1Тгее.Е1еаепг, имеющим Мы исключили несколько строк и уменьшили отступы. Размер файла составляет примерно 840 Кбайт, поэтому мы сжали его с помощью яз!р до более приемлемого размера в 72 Кбайт. К сожалению, парсер на основе анализа элементов дерева требует либо имя файла, либо объект файла, но он не в состоянии работать со сжатыми файлами, так как с его точки зрения такие файлы являются набором случайных двоичных данных.
Решить эту проблему можно, выполнив следующие два действия: Обзор стандартной библиотеки пзыка рутбоп 267 тег с указанным именем. Чтобы извлечь текст, достаточно воспользоваться атрибутом техт элемента. Как и в случае с функцией оз. иа1К(), нам не требуется предусматривать рекурсивную обработку — методитератор сам сделает все необходимое. Если метод вызвать без имени тега, то с помощью полученного итератора можно будет выполнить обход всех элементов документа ХМ) .
Прочие модули В книге недостаточно места, чтобы охватить почти 200 пакетов и модулей, входящих в состав стандартной библиотеки. Тем не менее этого краткого обзора вполне достаточно, чтобы получить представление о некоторых ключевых пакетах, применяемых в наиболее важных областях программирования. В последнем подразделе этого раздела мы рассмотрим еще несколько областей, представляющих для нас интерес.
В предыдущем разделе мы видели, насколько просто создавать тесты в строках документирования и запускать их с помощью модуля Зостезт. В составе библиотеки имеется также платформа модульного тестирования, реализованная в виде модуля оп(ттезт, — это версия платформы тестирования П)п11 языка )атга, реализованная для языка РуФ)топ. Кроме того, модуль с)остезт предоставляет некоторые возможности интеграции с модулем оп(ттеат.
Помимо этого, существуют платформы тестирования, созданные сторонними разработчиками, например ру. тезт (сос(езреаИ.пег/ру/Жзт/) и позе (шшш зете(ЫпааЬоитогапае.сот/тг(/рго/естз/позе/). Приложения, работающие в неинтерактивном режиме, такие как серверы, часто сообщают о проблемах посредством записи сообщений в файлы журналов. Модуль 1орц! пр предоставляет универсальный интерфейс для записи сообщений в файлы журналов, а также он способен отправлять сообщения с помощью запросов НТТР ОЕТ и РОЯТ, посредством сонетов или по электронной почте.
В библиотеке имеется множество модулей, позволяющих выполнять интроспекцию и манипулирование программным кодом, и хотя их обсуждение выходит далеко за рамки этой книги, тем не менее следует упомянуть о модуле ррг1пт, который содержит функции форматированного вывода объектов Ру$)топ, включая коллекции, что иногда бывает удобно при отладке. В главе 8 будет представлен простой пример использования модуля 1парест, выполняющий интроспекцию существующих объектов. Модуль тпгеаотпр предоставляет поддержку создания многопоточных приложений, а модуль овесе реализует три различных типа очередей, которые могут безопасно использоваться в многопоточных приложениях.
Тема управления несколькими потоками выполнения будет рассматриваться в главе 8. 268 Глава 5, Модули В языке Ру1Ьоп отсутствует встроенная поддержка создания приложений с графическим интерфейсом, тем не менее имеется несколько библиотек графического интерфейса, которые могут использоваться в программах на языке Ру(Ьоп.
Модуль гг!лгег обеспечивает доступ к библиотеке Т)г, которая обычно устанавливается вместе с системой. Программирование графического интерфейса рассматривается в главе 13. Модуль авс (АЬв1гас1 Вазе С1авв — базовый абстрактный класс) предоставляет функции, необходимые для создания базовых абстрактных классов. Этот модуль будет рассматриваться в главе 8.
Модуль сору предоставляет функции сору сору() и сору. Зеерсору( ), которые уже обсуждались в главе 3. Доступ к внешним функциям, то есть к функциям в разделяемых библиотеках (файлы лИ в Ж1пг(овгз, .е(уИЬ вЂ” в Мас ОЯ Х и файлы .зов в апик), обеспечивается модулем сгурез, В языке Ру1Ьоп имеется также поддержка С АР1, благодаря чему имеется возможность создавать нестандартные типы данных и функции на языке С и обеспечивать их доступность из программного кода на языке Ру1Ьоп. Обсуждение модуля сгурев и поддержки С АР1 выходит далеко за рамки этой книги. Если ни один из пакетов и модулей, упомянутых в этом разделе, не обеспечивает необходимые функциональные возможности, то прежде чем приступать к разработке собственных функций, ознакомьтесь с описанием глобального каталога модулей Ру(Ьоп (О1оЬа! Моди1е 1пдех); возможно, там вы найдете подходящий модуль, поскольку здесь мы не в состоянии упомянуть все существующие модули.
В случае неудачи попробуйте поискать нужный модуль в каталоге пакетов Ру(Ьоп (Ру(Ьоп Рас!саяе 1пе(ех — рур1.ругйоп.ога/рур(), в котором содержится несколько тысяч расширений для Ру(Ьоп — от маленьких модулей, состоящих из единственного файла, и до огромных пакетов библиотек и платформ, насчитывающих сотни модулей. В заключение Эта глава была начата с рассмотрения нескольких разновидностей синтаксиса, используемых для импортирования пакетов, модулей и объектов, находящихся внутри модулей. Мы отметили, что многие программисты предпочитают использовать синтаксис 1врогг )эроггаЫе, чтобы избежать конфликтов имен, и что не следует давать программам и модулям имена, совпадающие с модулями или каталогами Ру1Ьоп верхнего уровня. Мы также обсудили пакеты Ру1Ьоп.
Пакеты — это обычные каталоги, содержащие файл (п(1 .ру и один или более модулей .ру. Файл (п(1 .ру может быть пустым, иодля поддержки синтаксиса Ггоз аэ- рогтаЫе 1зрсгГ * мы можем создать в этом файле специальную пере- В заключение 269 менную аП, представляющую собой список имен в модуле. Кроме того, в файл (л(! чэу можно поместить любой программный код, выполняющий инициализацию. Также было отмечено, что пакеты могут вкладываться друг в друга, для чего достаточно просто создать подкаталоги, каждый из которых содержит свой собственный файл (л)(,ру. Были описаны два нестандартных модуля. Первый из них предоставляет всего несколько функций и имеет очень простые доктесты.