М. Лутц - Изучаем Python (4-е издание)- 2011 (1126907), страница 76
Текст из файла (страница 76)
За дополнительной информацией обращайтесь к главе 36 и к руководству по библиотеке языка Python илиимпортируйте модуль struct в интерактивном сеансе и передайте имя structфункции help. Обратите также внимание, что режимы доступа к двоичнымфайлам ‘wb’ и ‘rb’ могут использоваться для обработки простейших двоичныхфайлов, таких как изображения или аудиофайлы, без необходимости выполнять распаковку их содержимого.Менеджеры контекста файловВам также необходимо будет прочитать обсуждение поддержки менеджеровконтекста файлов в главе 33, впервые появившейся в версиях Python 3.0 и 2.6.Даже при том, что менеджеры контекста в основном применяются для обработки исключений, тем не менее они позволяют обертывать программный код,выполняющий операции с файлами, дополнительным слоем логики, которыйгарантирует, что после выхода за пределы блока инструкций менеджера файлбудет закрыт автоматически, и позволяет не полагаться на автоматическое закрытие файлов механизмом сборки мусора:with open(r’C:\misc\data.txt’) as myfile: # Подробности в главе 33for line in myfile:...операции над строкой line...Аналогичную функциональность предоставляет конструкция try/finally,с которой мы познакомимся в главе 33, но за счет избыточного программногокода – три дополнительных строки, если быть более точным (впрочем, мы можем не использовать ни один из вариантов и позволить интерпретатору самомузакрывать файлы):myfile = open(r’C:\misc\data.txt’)try:for line in myfile:...операции над строкой line...finally:myfile.close()Поскольку для подробного описания обоих способов необходимо иметь дополнительные знания, которыми мы еще не обладаем, мы обсудим в книге эти детали позже.Другие инструменты для работы с файламиКак показано в табл. 9.2, существуют более сложные инструменты для работыс файлами, более того, существуют и другие инструменты, которые отсутствуют в таблице.
Например, функция seek переустанавливает текущую позициюв файле (для следующей операции чтения или записи), функция flush принудительно выталкивает содержимое выходных буферов на диск (по умолчаниюфайлы всегда буферизуются) и так далее.300Глава 9. Кортежи, файлы и все остальноеРуководство по стандартной библиотеке и книги, упомянутые в предисловии,содержат полный перечень методов для работы с файлами. Чтобы кратко ознакомиться с ним, можно также воспользоваться функцией dir или help в интерактивном сеансе, передав ей объект открытого файла (в Python 3.0, но нев Python 2.6, где следует передать имя типа file).
Дополнительные примерыработы с файлами вы найдете во врезке «Придется держать в уме: сканирование файлов» в главе 13. В ней приводятся типичные примеры организации циклов для просмотра содержимого файлов и приводятся инструкции, которыемы еще не рассматривали.Следует также отметить, что функция open и объекты файлов, которые она возвращает, являются в языке Python основным интерфейсом к внешним файлам,однако в арсенале Python существуют и другие инструменты, напоминающиефайлы. Назовем некоторые из них:Стандартные потоки ввода-выводаОбъекты уже открытых файлов в модуле sys, такие как sys.stdout (смотритераздел «Инструкция print» в главе 11)Дескрипторы файлов в модуле osЦелочисленные дескрипторы файлов, обеспечивающие поддержку низкоуровневых операций, таких как блокировка файловСокеты, каналы и очереди (FIFO)Объекты, по своим характеристикам напоминающие файлы, используемыедля синхронизации процессов или организации взаимодействий по сетиФайлы с доступом по ключу, известные как «хранилища» («shelves»)Используются для хранения объектов языка Python по ключу (глава 27)Потоки командной оболочкиТакие инструменты, как os.popen и subprocess.Popen, которые�������������������������������поддержива�����������ют возможность запуска дочерних процессов и выполнения операций с ихстандартными потоками ввода-выводаСреди сторонних открытых модулей можно отыскать еще больше инструментов, напоминающих файлы, включая реализацию поддержки обмена данными через последовательный порт в расширении PySerial и поддержки обменаданными с интерактивными программами в системе pexpect.
Дополнительнуюинформацию о подобных инструментах вы найдете в специализированной литературе по языку Python и в Сети.Примечание, касающееся различий между версиями: В версииPython 2.5 и в более ранних имя open встроенной функции фактически было синонимом имени типа file, а файлы, с технической точки зрения, можно было открыть вызовом функции openили file (хотя предпочтительнее использовать функцию open).В Python 3.0 имя file больше недоступно, потому что оно дублирует имя open.Пользователи Python 2.6 могут также использовать имя fileкак имя типа объекта файла для создания дочерних классов прииспользовании объектно-ориентированного стиля программирования (описывается ниже в этой книге).
В Python 3.0 файлыизменились�����������������������������������������������������������������������������������������������радикально�������������������������������������. �����������������������������������Классы, которые могут использовать-301Пересмотренный перечень категорий типовся в качестве родительских, для реализации собственных типовфайлов, находятся в модуле io. За дополнительной информацией обращайтесь к документации по этому модулю или к исходным текстам доступных классов.
Попробуйте также вызватьфункцию type(F), передав ей объект открытого файла F.Пересмотренный перечень категорий типовТеперь, когда мы познакомились со всеми встроенными базовыми типамиязыка Python в действии, давайте завершим наше турне рассмотрением некоторых общих для них свойств. В табл. 9.3 приводится классификация всехрассмотренных типов по категориям, которые были введены ранее. Напомнюнекоторые положения:•• Над объектами одной категории могут выполняться одни и те же операции, например над строками, списками и кортежами можно выполнятьоперации для последовательностей, такие как конкатенация и определение длины.•• Непосредственное изменение допускают только изменяемые объекты (списки, словари и множества) – вы не сможете непосредственно изменить числа, строки и кортежи.•• Файлы экспортируют только методы, поэтому понятие изменяемости к нимпо-настоящему неприменимо – хотя они могут изменяться при выполненииоперации записи, но это не имеет никакого отношения к ограничениям типов в языке Python.•• В категорию «Числа» в табл. 9.3 входят все числовые типы: целые (длинныецелые, в Python 2.6), вещественные, комплексные, фиксированной точности и рациональные.•• В категорию «Строки» в табл. 9.3 входят строки типа str, а также bytes (вверсии 3.0) и unicode (в версии 2.6).
Строковый тип bytearray в������������������������������� ��������������версии�������� 3.0 от���носится к изменяемым типам.•• Множества напоминают словари, в которых ключи не имеют значений. Элементы множеств не отображаются на значения и неупорядочены, поэтомумножества нельзя отнести ни к отображениям, ни к последовательностям.Тип frozenset – это неизменяемая версия типа set.•• Вдобавок к вышесказанному, в версиях Python���������������������������������������������������������������� 2.6 и 3.0 все типы, перечисленные в табл. 9.3, обладают методами, которые обычно реализуют операции, характерные для определенного типа.Таблица 9.3. Классификация объектовТип объектовКатегорияИзменяемый?Числа (все)ЧислаНетСтрокиПоследовательностиНетСпискиПоследовательностиДаСловариОтображенияДаКортежиПоследовательностиНет302Глава 9.
Кортежи, файлы и все остальноеТаблица 9.3 (продолжение)Тип объектовКатегорияИзменяемый?ФайлыРасширенияПонятие неприменимоМножестваМножестваДаФиксированные множества Множества(frozenset)bytearray (3.0)ПоследовательностиНетДаПридется держать в уме: перегрузка операторовВ шестой части книги мы увидим, что объекты, реализованные с помощью классов, могут свободно попадать в любую из этих категорий.Например, если нам потребуется реализовать новый тип объектов последовательностей, который был бы совместим со встроенными типамипоследовательностей, мы могли бы описать класс, который перегружаетоператоры индексирования и конкатенации:class MySequence:def __getitem__(self, index):# Вызывается при выполнении операции self[index]def __add__(self, other):# Вызывается при выполнении операции self + otherи так далее.
Точно так же можно было бы создать новый изменяемыйили неизменяемый объект, выборочно реализовав методы, вызываемыедля выполнения операций непосредственного изменения (например, длявыполнении операций присваивания self[index] = value вызывается метод __setitem__). Существует также возможность выполнять реализациюновых объектов на других языках программирования, таких как C, в виде расширений. Чтобы определить выбор между множествами операцийнад числами, последовательностями и отображениями, необходимо будет подставить указатели на функции C в ячейки структуры.Гибкость объектовВ этой части книги были представлены несколько составных типов объектов(коллекции с компонентами).
В общем случае:•• Списки, словари и кортежи могут хранить объекты любых типов.•• Списки, словари и кортежи допускают произвольную вложенность.•• Списки и словари могут динамически увеличиваться и уменьшаться.Поскольку составные типы объектов в языке Python поддерживают любыеструктуры данных, они прекрасно подходят для представления в программахданных со сложной структурой. Например, значениями элементов словареймогут быть списки, которые могут содержать кортежи, которые в свою очередьмогут содержать словари, и так далее. Вложенность может быть произвольной303Ссылки и копииглубины, какая только потребуется, чтобы смоделировать структуру обрабатываемых данных.Рассмотрим пример с вложенными компонентами. В следующем примере определяется три вложенных составных объекта последовательностей, как показано на рис. 9.1.
Для обращения к отдельным элементам допускается использовать столько индексов, сколько потребуется. В языке Python разыменованиеиндексов производится слева направо и на каждом шаге извлекается объектна более глубоком уровне. Структура данных на рис. 9.1 может показаться излишне сложной, но она иллюстрирует синтаксис, который используется длядоступа к данным:>>> L = [‘abc’, [(1, 2), ([3], 4)], 5]>>> L[1][(1, 2), ([3], 4)]>>> L[1][1]([3], 4)>>> L[1][1][0][3]>>> L[1][1][0][0]3[0][1][0][2][1]abc[0]5[1][0][1][0]1243Рис. 9.1. Дерево вложенных объектов со смещениями их компонентов,созданное с помощью литерального выражения [‘abc’, [(1, 2), ([3], 4)], 5].