Лутц М. - Изучаем Python (1077325), страница 54
Текст из файла (страница 54)
д. Открытие файлов В табл. 9. 2 приводятся наиболее часто используемые операции над файлами. Чтобы открыть файл, программа должна вызвать функцию преп, передав ей имя внешнего файла и режим работы. Обычно в качестве режима используется строка ' г', когда файл открывается для чтения 245 Файлы (по умолчанию), 'гг' — когда файл открывается для записи, или 'а'— когда файл открывается на запись в конец.
Существуют и другие возможности, но мы не будем упоминать о них здесь. В некоторых случаях в конец строки режима может добавляться символ Ь, что позволяет работать с двоичными данными (интерпретация символов новой строки отключена), а добавление символов а+ означает, что файл открывается как для чтения, так и для записи (т. е. из файла можно читать и записывать в него с помощью одного и того же объекта). Таблица 9.2. Часто используемые операции над файлами Операция Интерпретация опгрпз = преп( /Юргврве', 'п' ) Открываетфайл для записи('н' означает вгг)(е— запись) 1прпг = орвп('Свгв, 'г') 1ПРп1 = ОРЕП('Свзв') вепчпр = 1прпк гевс() аьгг1пр = 1пррп геаз(и) вьгг1пр = 1прпг гввс11пв() Чтение файла целиком в список строк Запись строки в файл Запись всех строк нз списка в файл сьзрпк (1пвз() апуег1е.веси(и) Оба аргумента функции ореп должны быть строками. Кроме того, может использоваться третий необязательный аргумент, управляющий буферизацией выводимых данных, — значение ноль означает, что выходная информация не будет буферизироваться (т.
е. она будет записываться во внешний файл сразу же, в момент вызова метода записи). Имя внешнего файла может включать платформозависимые префиксы абсолютного или относительного пути к файлу. Если путь к файлу не указан, предполагается, что он находится в текущем рабочем каталоге (т. е. в каталоге, где был запущен сценарий). аювз = 1прпп гевб11пев() спгрпг, нг(1в(взгг1пр) аырпк игЫЕ1гпез(зюзю) опгрпг с1све() Открывает Файл для чтения ( г ' означает геаг(— чтение) То же самое, что н в предыдущей строке (ре- жим ' г' используется по умолчанию) Чтение файла целиком в единственную строку Чтение следующих а байтов (одного илн более) в строку Чтение следующей текстовой строки (включаа символ конца строки) в строку Закрытие файла вручную (выполкяется по окончании работы с Файлом) Выталкивает выходные буферы ва диск, файл остается открытым Изменяет текущую позицию в файле лля сле- дующей операции, смещая ее на и байтов от на- чала Файла.
246 Глава 9. Кортежи, файлы и все остальное Использование файлов Как только будет получен объект файла, вы можете вызывать его методы для выполнения операций чтения или записи. В любом случае содержимое файла в программах на языке Ру(Ьоп принимает форму строк — операция чтения возвращает текст в строках, а метод записи принимает информацию в виде строк. Существует несколько разновидностей методов чтения и записи, а в табл. 9.2 перечислены лишь наиболее часто используемые из них. Несмотря на то, что методы чтения и записи, перечисленные в таблице, являются наиболее часто используемыми, имейте в виду, что самый лучший, пожалуй, способ чтения строк из файла на сегодняшний день состоит в том, чтобы не читать файл вообще — как будет показано в главе 13, файлы имеют илтералтор (Вегатог), который автоматически читает информацию из файла строку за строкой в контексте цикла тог, в генераторах списков и в других итерационных контекстах.
Обратите внимание: данные, получаемые из файла, всегда попадают в сценарий в виде строки, поэтому вам необходимо будет выполнять преобразование данных в другие типы объектов языка РуФЬоп, если эта форма представления вам не подходит. Точно так же при выполнении операции записи данных в файл, в отличие от инструкции рылц интерпретатор Ру(Ьоп не выполняет автоматическое преобразование объектов в строки — вам необходимо передавать методам уже сформированные строки. Поэтому при работе с файлами вам пригодятся рассматривавшиеся ранее инструменты преобразования данных из строкового представления в числовое и наоборот (например, тот, г1оат, втг и выражения форматирования строк).
Кроме того, в состав РуФоп входят дополнительные стандартные библиотечные инструменты, предназначенные для работы с универсальным объектом хранилища данных (например, модуль ртсК1е) и обработки упакованных двоичных данных в файлах (например, модуль зт гост).
С действием обоих модулей мы познакомимся ниже, в этой же главе. Вызов метода с1озе разрывает связь с внешним файлом. Как рассказывалось в главе 6, интерпретатор РуФЬоп немедленно освобождает память, занятую объектом, как только в программе будет утеряна последняя ссылка на этот объект. Как только объект файла освобождается, интерпретатор автоматически закрывает ассоциированный с ним файл. Благодаря этому вам не требуется закрывать файл вручную, особенно в небольших сценариях, которые выполняются непродолжительное время. С другой стороны, вызов метода с1ове не повредит, и его рекомендуется использовать в крупных системах.
Строго говоря, возможность автоматического закрытия файлов не является частью спецификации языка, и с течением времени такое поведение может измениться. Следовательно, привычку вызывать метод с1ове вручную можно только приветствовать. Файлы Файлы в действии Давайте рассмотрим небольшие примеры, демонстрирующие основы работы с файлами.
В первом примере выполняется открытие нового файла в режиме для записи, в него записывается строка (завершающаяся символом новой строки чп), после чего файл закрывается. Далее этот же файл открывается в режиме для чтения и выполняется чтение строки из него. Обратите внимание, что второй вызов метода геаб1гое возвращает пустую строку — таким способом методы файла в языке Ру()Хоп сообщают о том, что был достигнут конец файла (пустая строка в файле возвращается как строка, содержащая единственный символ новой строки, а не как действительно пустая строка).
Ниже приводится полный листинг сеанса: № Открывает файл для записи (создавт файл) еХп') № Записывает строку текста Выталкивает выходные буферы нз диск Открывает файл для чтения: 'г' - по уиолчанию Читает строку Пустая строка: конец Фзйлз Этот пример записывает единственную строку текста в файл, добавляя в нее символ конца строки ч~п — методы записи не добавляют символ конца строки, поэтому нам необходимо добавлять его в выводимые строки (в противном случае следующая операция записи дополнит текущую строку в файле). Сохранение и интерпретация объектов Рутххоп в файлах Теперь создадим большой файл.
Следующий пример записывает раз- личные объекты в текстовый файл. Обратите внимание на использова- ние средств преобразования объектов в строки. Напомню, что данные всегда записываются в файл в виде строк, а методы записи не выпол- няют автоматического преобразования данных: Объекты языка Рутлоп долины записываться в Файл только в вида строк »>Х, У, 2-"43, 44, 45 № »> 8 = 'Враз' № >» о = ('а': и 'ь'; 2) »> 1 = (Н 2, 8) »> »> Е орел('баге(11е.(хг', 'и') »> Е.агате(8 + 'хп') »> Е.агате('Хв,хв,авХп' Х (Х, у, »> Е.итие(в(г(1) + 8 + втг(0) »> Е,с1ове() Создав файл, мы можем исследовать его содержимое, открыв файл и прочитав данные в строку (одной операцией).
Обратите внимание, что функция автоматического вывода в интерактивной оболочке дает точное побайтовое представление содержимого, а инструкция рып( »> ау(11е = орел('ау№11е', 'и') »> ау(11е.аггее('Пе11о Хех( Г11 »> ау№11е,с1ове() »> ау(11е = орел('ау(11е') »> аун1е. геаб11пе() № 'пе11о техт (>1е1п' »> ау(11е.гваб1(пе() № № Создает Файл для записи № Строки завершаются сииволои (и 2)) № Првобрззувт числа в строки + 'Хп') № Преобразует и разделяет сииволои $ 248 Глава 9.
Кортежи, файлы и все остальное интерпретирует встроенные символы конца строки, чтобы обеспечить более удобочитаемое отображение: »> ьутев = орел('бата№11е,тхт').гевб() № Отобращение оугез »> Ьутев № в нерориатироааннон виде "зравкп43,44,45ч,я[ 1, 2, 3)З('а' 1. 'ь': 2)'чп" »> рг1пт Ьутев № Удобочитаеиое представление Зрав 43,44,45 [ 1, 2, 3)З('а'; 1, 'ь': 2) »> Р = орел('бата№11е.тхт') »> 11пе = Р.геаа11пе() »> 11пе 'Зравуп' »> 11пе.гвтг1Р() 'Зрав' № Открыть райн снова № Прочитат~ одну строку № удалить сиивол конца строки Для этой первой строки был использован метод гвтг[р, чтобы удалить завершающий символ конца строки. Тот же эффект можно было бы получить с помощью извлечения среза 1> пе[: -1), но такой подход можно использовать, только если мы уверены, что все строки завершаются символом к,п (последняя строка в файле иногда может не содержать этого символа).
Пока что мы прочитали ту часть файла, которая содержит строку. Теперь прочитаем следующий блок, в котором содержатся числа, и выполним разбор этого блока (т. е. извлечем объекты): № Следующая строка из Файла № Это - строка »> 11пе = Р. гевб11пе() »> Ипе 43,44,451п >» рвгтв = 11пе.вр111(',') »> раста ['43', '44', '451п') № Разбить на подстроки по залатан Здесь был использован строковый метод вр111, чтобы разбить строку на части по запятым, которые играют роль символов-разделителей— в результате мы получили список строк, каждая из которых содержит отдельное число.