Саммерфилд - Программирование на Python 3 (1077331), страница 56
Текст из файла (страница 56)
В дополнение к поддержке различных форматов файлов стандартная библиотека содержит пакеты и модули, обеспечивающие средства сохранения данных. Модуль рте(т1е используется для сохранения на диске и восстановления с диска произвольных объектов Ру1Ьоп (включая целые коллекции) — подробнее об этом модуле рассказывается в главе 7.
Помимо этого, стандартная библиотека поддерживает файлы ПВМ различных типов — эти файлы напоминают словари за исключением того, что их содержимое хранится на диске, а не в памяти, а их ключи и значения должны быть либо объектами типа Ъузеэ, либо строками. Модуль вЬе1че, описываемый в главе 11, может использоваться для работы с файлами 1)ВМ со строковыми ключами и произвольными объектами РуФЬоп в качестве значений — модуль незаметно для пользователя преобразует объекты Ру$Ьоп в объекты типа Ьу$еа и обратно.
Модули для работы с файлами )хВМ, прикладной программный интерфейс к базам данных и использование встроенной базы данных Яь(1.11е рассматриваются в главе 11. Пример: модуль Ьавеб4 Модуль оаае64 главным образом используется для обработки двоичных данных, внедренных в сообщения электронной почты в виде текста АЯСП. Он также может использоваться для сохранения двоичных данных в файлах с расширением .ру. Первый шаг состоит в том, чтобы преобразовать двоичные данные в формат Ваэеб4. В следующем фрагменте предполагается, что модуль Ьаае64 уже был импортирован, а путь к файлу.рлд хранится в переменной 1е(т а1трп рпр: шпагу = орел(1атт а1трп рпр, "го").геао() ааст1 тахт = "" гог т, с тп епоэегата(оааа64.664апооое(шпагу)): тт т апс т % 66 == О: ааоы техт Я= "т,Чтп" ааом тахт += спг(о) 1етт а)трп.
рпд Этот фрагмент программного кода читает файл в режиме Тип данных двоичного доступа и преобразует его в строку символов АЯСП, в формате Ваэе64. После каждого шестьдесят вось- стр. 644 мого символа к строке добавляется комбинация символа обратного олеша и перевода строки. Это ограничивает 258 Глава 5. Модули ширину строк 68 символами АБСН и гарантирует, что при обратном чтении данных символы перевода строки будут проигнорированы (потому что символы обратного олеша экранируют их).
Текст АЯСН, полученный таким способом, может сохраняться в виде литерала типа Ьугев в файле с расширением .ру, например: ЕЕРТ АС16И РИВ = Ь"""'х 1ЧВОВЧОКОдоААААИБЧЬЕУВАААСАААААдСАУАААВааогОААААВСЬВТОЕААЕОРС/хЬВОАА~ ЬваооВРАвЧТ2+СиуувгСЧА90ГРИСК1+ЬИВр18ГСИдсОггрдиВЬ2гЧСВ+42уеАААААЕ1РХ ТКБодвСС""" Мы опустили большую часть строк, заместив их многоточием. Данные могут быть преобразованы обратно в первоначальный формат, как показано ниже: Ьшагу = Ьаве64.Ь64аасосе(ЕЕРТ АЕ16И РИО) Двоичные данные могут быть записаны в файл с помощью цепочки вызовов: орел( гт1елаве, ГИЬ" ) . Иг11е(Ь)лагу).
Двоичные данные в файлах .Ру занимают значительно больше места, чем в оригинальной форме, но такая возможность может быть полезной, когда нам потребуется написать программу, хранящую все необходимые двоичные данные в виде единственного файла .ру. Пример: модуль Саут))е В большинстве версий ЪУ1пс(очгв отсутствует встроенная поддержка работы с форматом паг, который очень широко используется в системах Т))х)1Х. Этот недостаток легко можно ликвидировать с помощью модуля С а г111е из стандартной библиотеки РуЬЬоп, который способен создавать и распаковывать архивы лаг и .1аг.лг (которые называют лтарболлами), а при наличии дополнительных библиотек еще и архивы лог.бг2. Ниже приводятся ключевые выдержки из программы ил.
сопру, способной распаковывать тарболлы средствами модуля Таг(т1е. Начинается программа с инструкций импортирования: 822 АЧА1ЕАВЕЕ = Тгое Тгу: ырогс Ьг2 ехсерс !врогГЕггог; 872 АЧА1ЕАВЕЕ = Ра1ве Модуль Ь22 используется для работы с форматом сжатия Ьв1р2, но операция импортирования будет терпеть неудачу, если интерпретатор РуЬЬоп был собран без доступа к библиотеке Ьв1р2. (Версии РуЬЬоп для ТАГ1пс)оччв всегда собираются со встроенной поддержкой сжатия Ьв1р2, поэтому отсутствовать она может только в некоторых сборках для ())х)1Х.) Здесь учитывается возможность того, что модуль может быть недоступен, именно поэтому используется блок 1гу .. ехсерг и логическая переменная, к которой можно будет обратиться позже (хотя Обзор стандартной библиотеки языка Рутбоп 259 здесь мы не будем приводить программный код, который обращается к ней).
ОнтнОБтед РнеР1хеБ = тор1е(("/ . \Х ) ' (с + ";" тог с (п втыпд.авсы 1еттегв]) Эта инструкция создает кортеж ('/', ''ч', 'А: ', 'В: ', ..., 'Е: ', 'а: ', 'г: '). Любое имя файла в тарболле, начинающееся с указанных префиксов, считается подозрительным — в именах файлов втарболле не должны использоваться абсолютные пути, поскольку это влечет за собой риск перезаписи системных файлов; поэтому в качестве предварительной меры мы не будем распаковывать файлы, имена которых начинаются с указанных префиксов.
оет оптаг(агсп(че): твг = Носе тгу: гвг = твгтт1е.преп(агсюче) тот пепоег тп таг.детвевоегв(): )т пепЬег.папе,втвгтвнт(П(ОЙТНОБТЕЬ РНЕР1ХЕБ): ргтпт("сптгчвтес ргегтх, тцпогтпц", пепьег.папе) е11Г ".." тп пеэЬег.папе: ргют("воврест рагс, тдпог)пц", вепЬег.папе) е1ве; твг.ехтгаст(пеэоег) ргтпт("опрасхес", эепЬег.папе) ехсерт (тагтт1е.тагеггог, епчтгоппептеггог) ав егг: еггог(егг) ттпа11у: тт таг тв пот нопе: таг.с1ове() Каждый файл в тарболле называется членом.
Функция таггт1е. цетаеаЬегв() возвращает список объектов тат(11е. Таг1пто, по одному для каждого члена. Имена файлов членов, включая пути, хранятся в атрибуте тагтт1е. Тзг1п(о. паве. Если имя начинается с одного из подозрительных префиксов или содержит .. в пути, программа выводит сообщение об ошибке; в противном случае вызывается функция тагт!1е.ехтгаст(), сохраняющая член на диск. Модуль тагтт)е определяет множество собственных исключений, но в программе используется упрощенный подход к обработке ошибок, поэтому, когда возбуждается какое-либо исключение, она просто выводит текст сообщения об ошибке и завершает работу. овт еггог(пввваце, ехы атагов=т): рг1пт(певваце) вув.ехтт(ехтт агатов) Функция еггог() приведена здесь лишь для полноты картины.
Функция эазп() (которая здесь не приводится) выводит сообщение о порядке использования, еелн программа была запущена с ключом -Ь или 260 Глава 5. Модули — Пе1р; в противном случае она выполняет некоторые основные проверки, после чего вызывает функцию опгзг(), передавая ей имя файла тарболла. Работа с файлами, каталогами и процессами Модуль япо!11 предоставляет высокоуровневые функции для работы с файлами и каталогами, включая яоо! !1, сору( ) и яоог!1, сору! гее( ), позволяющие копировать файлы и целые деревья каталогов; япиы1,вове(), позволяющую перемещать деревья каталогов, и язог!1.
га(гее(), позволяющую удалять целые деревья каталогов, даже непустые. Временные файлы и каталоги должны создаваться с помощью модуля гевр(!1е, который включает все необходимые для этого функции, например, !еврГ!1е.вхягевр(), и обеспечивает максимально возможную безопасность временных файлов. Модуль Г!1есар может использоваться для сравнения файлов — с помощью функции Г!1есвр.
свр() и целых каталогов — с помощью функции Г!1есвр. сарп!1ея(). Одна из областей, где особенно эффективно могут использоваться программы на языке Ру!)юп, — это управление ходом выполнения других программ. Реализовать такое управление можно средствами модуля яооргосеяя, позволяющими запускать другие процессы, взаимодействовать с ними с помощью каналов и получать возвращаемые значения. Этот модуль описывается в главе 9. Существует более мощная альтернатива, в виде модуля во11!ргосеяя!пр, обладающего обширными возможностями распределения работы между несколькими процессами и сбора результатов. Этот модуль нередко может использоваться как альтернатива многопоточной обработке данных.
Модуль оя обеспечивает платформонезависимый доступ к средствам операционной системы. Переменная оя. епч! гоп хранит объект отображения, элементами которого являются имена переменных окружения и их значения. Рабочий каталог программы можно получить с помощью функции оя, ре!сиО(), а изменить его можно с помощью функции оя, сПО! г(). Кроме того, модуль содержит функции для низкоуровневой работы с файлами на основе их дескрипторов. Функция оя. ассеяя() может использоваться для определения наличия файла или его доступности для чтения или записи.
Функция оя.1!я!о!г() возвращает список записей (то есть имен файлов и каталогов, за исключением элементов и ) в указанном каталоге. Функция оя.я!а!() возвращает различные сведения о файле или каталоге, такие как режим доступа, время последнего обращения и размер. Каталоги могут создаваться с помощью функции оя. апс!г() или, если потребуется попутно создать промежуточные каталоги, с помощью функции оя.вяхеО1гя(). Пустые каталоги могут удаляться с помощью функции оя, гвО!г(), а деревья каталогов, содержащие только пустые Обзор стандартной библиотеки языка Русйол 261 каталоги, — с помощью функции ов, геаоуебт гв(). Файлы или каталоги могут удаляться с помощью функции ов, геаоае(), а переименовываться с помощью функции ов. гепаае(). Функция ов.
аа1К( ) позволяет выполнять итерации по всему дереву каталогов, по очереди извлекая все имена файлов и каталогов. Кроме того, модуль ов содержит множество низкоуровневых, платформозависимых функций, например, для работы с дескрипторами файлов, а также для ветвления (только в системах БХ1Х), порождения дочерних процессов и для запуска процессов. Модуль ов предоставляет функции для взаимодействия с операционной системой, в частности, для работы с файловой системой, а модуль ов.
ра1П содержит набор функций для работы со строками (путями к файлам) и некоторые вспомогательные функции для работы с файловой системой. Функция ов. ра1П. аЬврасл() возвращает абсолютный путь для своего аргумента, с удалением избыточных разделителей имен каталогов и элементов . Функция ов. ра1П. вр111() возвращает кортеж, содержащий 2 элемента, первый элемент которого содержит путь, а второй — имя файла (который будет представлен пустой строкой, если имя файла в указанном пути не задано). Эти две части могут быть получены по отдельности, с помощью функций ов.рзсп.б!гпвае() и ов.