справочник по Python. мм isbn 9785932861578 9 785932 861578
Скачать 4.21 Mb.
|
FileIO(name [, mode [, closefd]]) Возвращает объект, реализующий низкоуровневые операции ввода-вывода над файлом или дескриптором файла. В аргументе name передается имя файла или дескриптор файла, аналогичный тому, что возвращается функ- цией os.open() или методом fileno() объектов файлов. В аргументе mode передается одно из значений: ‘r’ (по умолчанию); ‘w’ или ‘a’, соответствую- щие режимам открытия файла для чтения, для записи или для добавления в конец. В аргумент mode можно добавить символ ‘+’, который определяет режим открытия для изменения, когда поддерживаются обе операции – чтения и записи. В аргументе closefd передается флаг, который определя- ет, должен ли метод close() действительно закрывать сам файл. По умол- (продолжение) Модуль io 439 чанию получает значение True, но его можно установить в значение False, если объект класса FileIO используется как обертка вокруг файла, откры- того в другом месте программы. Если в аргументе name было передано имя файла, объект файла открывается с помощью системного вызова open(). Этот объект не поддерживает буферизацию данных и интерпретирует их как простые строки байтов. Экземпляр f класса FileIO может выполнять все основные операции ввода-вывода, описанные выше, и дополнительно обладает следующими атрибутами и методами: Атрибут Описание f.closefd Флаг, указывающий – будет ли закрыт дескриптор файла методом f.close() (только для чтения). f.mode Режим, выбранный при открытии файла (только для чтения). f.name Имя файла (только для чтения). f.read([size]) Читает не более size байтов с помощью единственного обраще- ния к системному вызову. Если аргумент size не указан, воз- вращает максимально возможное число байтов, прочитанных методом f.readall(). Эта операция может возвращать меньшее число байтов, чем указано в аргументе size, поэтому для про- верки всегда следует использовать функцию len(). В неблоки- рующем режиме возвращает None, если данные недоступны. f.readall() Читает максимально возможное число байтов и возвращает их в виде одной строки. По достижении конца файла возвра- щает пустую строку. В неблокирующем режиме возвращает объем данных, которые доступны на данный момент. f.write(bytes) Записывает строку байтов или массив байтов bytes в f, с по- мощью единственного обращения к системному вызову. Воз- вращает число байтов, которое было фактически записано. Это число может быть меньше, чем было передано в аргументе bytes Важно отметить, что объекты класса FileIO находятся на самом низком уровне, образуя тонкую прослойку над системными вызовами, такими как read() и write(). В частности, при использовании этих объектов необ- ходимо тщательно проверять возвращаемые значения, чтобы убедиться, что операции f.read() или f.write() прочитали и записали все данные. Для изменения низкоуровневых аспектов ввода-вывода, таких как блокировка файлов, поведение механизма блокировок и так далее, можно использо- вать модуль fcntl. Объекты класса FileIO не должны использоваться для работы с данными, имеющими построчное представление, такими как текст. Хотя объекты и обладают методами, такими как f.readline() и f.readlines(), но они уна- следованы от класса IOBase, где они реализованы исключительно на язы- ке Python, и читают данные по одному байту за раз, используя операцию f.read() . Получающаяся в результате производительность просто ужасна. Например, в Python 2.6 метод f.readline()объекта f класса FileIO работает 440 Глава 19. Службы операционной системы более чем в 750 раз медленнее, чем метод f.readline() стандартного объекта файла, созданного функцией open(). Буферизованный ввод-вывод двоичных данных Уровень буферизованного ввода-вывода содержит коллекцию объектов файлов, которые читают и записывают простые двоичные данные, но с бу- феризацией в оперативной памяти. При создании этим объектам должны передаваться объекты файлов, реализующие низкоуровневые операции ввода-вывода, такие как объекты класса FileIO, описанного в предыдущем разделе. Все классы, описываемые в этом разделе, являются производны- ми от класса BufferedIOBase. BufferedReader(raw [, buffer_size]) Возвращает объект класса BufferedReader, реализующий буферизованную операцию чтения двоичных данных из файла, указанного в аргументе raw. Аргумент buffer_size определяет размер буфера в байтах. Если этот аргу- мент опущен, используется значение по умолчанию DEFAULT_BUFFER_SIZE (8192 байтов на момент написания этих строк). Экземпляр f класса Buff- eredReader поддерживает все операции, реализованные классом IOBase, и дополнительно предоставляет реализацию следующих операций: Метод Описание f.peek([n]) Возвращает до n байтов из буфера ввода-вывода. Указатель теку- щей позиции в файле при этом не перемещается. Если аргумент n не указан, возвращает единственный байт. В случае необходи- мости выполняется операция чтения из файла, чтобы заполнить буфер, если он пустой. Этот метод никогда не возвращает число байтов больше, чем текущий размер буфера, поэтому возвращае- мый результат может содержать меньше байтов, чем было запро- шено в аргументе n. f.read([n]) Читает n байтов и возвращает их в виде строки байтов. При вы- зове без аргумента n будут прочитаны и возвращены все имею- щиеся данные (до конца файла). Если файл открыт в неблоки- рующем режиме, будут возвращены все доступные данные. При чтении файла в неблокирующем режиме, когда нет доступных данных, возбуждается исключение BlockingIOError . f.read1([n]) Читает до n байтов с помощью единственного обращения к си- стемному вызову и возвращает их в виде строки байтов. Если какие-либо данные уже были загружены в буфер, они извлека- ются из буфера. В противном случае производится единствен- ный вызов методаread() низкоуровневого объекта файла. В от- личие от метода f.read(), эта операция может возвращать меньше данных, чем было запрошено, даже если еще не был достигнут конец файла. f.readinto(b) Читает len(b) байтов из файла в существующий объект b типа bytearray . Возвращает фактическое количество прочитанных байтов. При чтении файла в неблокирующем режиме, когда нет доступных данных, возбуждается исключение BlockingIOError. Модуль io 441 BufferedWriter(raw [, buffer_size [, max_buffer_size]]) Возвращает объект класса BufferedWriter, реализующий буферизованную операцию записи двоичных данных в файл, указанный в аргументе raw. Аргумент buffer_size определяет количество байтов, которые можно со- хранить в буфере, прежде чем данные будут фактически записаны в поток ввода-вывода. По умолчанию используется значение DEFAULT_BUFFER_SIZE. В аргументе max_buffer_size передается максимальный размер буфера для хранения выходных данных, когда запись выполняется в неблокирующем режиме, который по умолчанию равен удвоенному значению buffer_size. Это значение должно быть больше, чтобы позволить продолжать запись данных, пока операционная система выполняет запись предыдущих дан- ных из буфера в поток ввода-вывода. Экземпляр f класса BufferedWriter под- держивает следующие операции: Метод Описание f.flush() Записывает все содержимое буфера в поток ввода-вывода. Если вывод осуществляется в неблокирующем режиме и выполнение операции блокируется, возбуждает исключе- ние BlockingIOError (например, если в текущий момент поток не может принять новую порцию данных). f.write(bytes) Записывает строку bytes в поток ввода-вывода и возвращает фактическое количество записанных байтов. Если вывод осуществляется в неблокирующем режиме и выполнение операции блокируется, возбуждает исключение BlockingIO- Error . BufferedRWPair(reader, writer [, buffer_size [, max_buffer_size]]) Возвращает объект класса BufferedRWPair, реализующий буферизованные операции чтения и записи двоичных данных из/в поток ввода-вывода. В аргументе reader передается низкоуровневый объект файла, поддержи- вающий операцию чтения, а в аргументе writer – низкоуровневый объект файла, поддерживающий операцию записи. Это могут быть разные файлы, что может оказаться удобным при организации некоторых видов взаимо- действий с помощью каналов и сокетов. Аргументы buffer_size и max_buf- _buf- buf- fer_size имеют тот же смысл, что и в функции BufferedWriter(). Экземпляры класса BufferedRWPair поддерживают все операции, предоставляемые объ- ектами классов BufferedReader и BufferedWriter. BufferedRandom(raw [, buffer_size [, max_buffer_size]]) Возвращает объект класса BufferedRandom, реализующий буферизованные операции чтения и записи двоичных данных из/в поток ввода-вывода, ко- торый поддерживает возможность произвольного доступа (то есть поддер- живает операцию перемещения указателя текущей позиции). В аргументе raw должен передаваться низкоуровневый объект файла, поддерживаю- щий операции чтения, записи и позиционирования. Аргументы buffer_size и max_buffer_size имеют тот же смысл, что и в функции BufferedWriter(). Экземпляры класса BufferedRandom поддерживают все операции, предостав- ляемые объектами классов BufferedReader и BufferedWriter. 442 Глава 19. Службы операционной системы BytesIO([bytes]) Ф айл, размещаемый в памяти и реализующий функциональность буфери- зованного потока ввода-вывода. В аргументе bytes передается строка бай- тов с начальным содержимым файла. Экземпляр b класса BytesIO поддер- живает все операции, предоставляемые объектами классов BufferedReader и BufferedWriter. Кроме того, он реализует метод b.getvalue(), который воз- вращает текущее содержимое файла в виде строки байтов. Как и объекты класса FileIO, объекты всех классов, описанных в этом раз- деле, не должны использоваться для работы с данными, имеющими по- строчное представление, такими как текст. Хотя наличие механизма бу- феризации немного улучшает ситуацию с производительностью, тем не ме- нее она все еще оставляет желать лучшего (например, в Python 2.6 чтение строк выполняется более чем в 50 раз медленнее, чем при использовании объекта файла, созданного функцией open()). Кроме того, из-за наличия внутренней буферизации следует помнить о необходимости выполнять операцию flush() при записи данных. Например, если в программе исполь- при записи данных. Например, если в программе исполь- записи данных. Например, если в программе исполь- записи данных. Например, если в программе исполь- данных. Например, если в программе исполь- данных. Например, если в программе исполь- . Например, если в программе исполь- Например, если в программе исполь- зуется метод f.seek() для перемещения указателя текущей позиции в новое местоположение, предварительно необходимо вызвать метод f.flush(), что- бы вытолкнуть данные, имеющиеся в буфере. Кроме того, имейте в виду, что аргументы, определяющие размер буфера, устанавливают ограничение лишь для операций записи, что не обязатель- но является ограничением для использования внутренних ресурсов. На- пример, когда вызывается метод f.write(data) буферизованного файла f, все байты в строке data сначала будут скопированы во внутренние буферы. Если аргумент data представляет очень большой массив байтов, то его ко- пирование повлечет за собой существенный расход памяти в программе. Поэтому запись данных больших объемов лучше выполнять порциями разумного размера, а не все сразу, одним вызовом операции write(). Следу- ет также отметить, что модуль io является достаточно новым, поэтому его поведение в будущих версиях может немного измениться. Ввод-вывод текстовой информации Уровень ввода-вывода текстовой информации используется для работы с текстовыми данными, имеющими построчное представление. Классы, объявленные в этом разделе, построены на базе буферизованных потоков ввода-вывода и добавляют возможность работы с текстовыми строками, а также кодирование и декодирование символов Юникода. Все классы это- го уровня являются производными от класса TextIOBase. TextIOWrapper(buffered [, encoding [, errors [, newline [, line_buffering]]]]) Класс буферизованного текстового потока. В аргументе buffered передается объект буферизованного потока ввода-вывода, один из тех, что был описан в предыдущем разделе. В аргументе encoding передается строка с названи- передается строка с названи- строка с названи- строка с названи- с названи- с названи- названи- названи- ем кодировки, такая как ‘ascii’ или ‘utf-8’. Аргумент errors определяет политику обработки ошибок кодирования символов Юникода и по умол- чанию имеет значение ‘strict’ (описание этого аргумента приводится Модуль io 443 в главе 9 «Ввод и вывод»). В аргументе newline передается последователь- ность символов, представляющая признак конца строки, который может принимать значения None, ‘’, ‘\n’, ‘\r’ или ‘\r\n’. Если указано значение None , включается режим использования универсального символа перево- да строки, когда при чтении любые символы конца строки преобразуются в символ ‘\n’, а при записи символ перевода строки замещается значением os.linesep . Если в аргументе newline передается любое другое значение, при записи все символы ‘\n’ будут замещаться этим значением. В аргументе line_buffering передается флаг, который определяет, будет ли выполняться операция flush() по окончании любой операции записи, которая выводит символ перевода строки. По умолчанию имеет значение False. Экземпляр f класса TextIOWrapper поддерживает все операции, реализованные классом IOBase , и дополнительно предоставляет реализацию следующих операций: Метод Описание f.encoding Имя используемой кодировки. f.errors Политика ошибок кодирования и декодирования. f.line_buffering Флаг, определяющий способ буферизации строк. f.newlines None , строка или кортеж со всеми различными формами преобразования символов перевода строки. f.read([n]) Читает до n символов из потока и возвращает их в виде строки. При вызове без аргумента n прочитает все доступ- ные данные до конца файла. По достижении конца файла вернет пустую строку. Возвращаемая строка декодируется в соответствии с именем кодировки в атрибуте f.encoding. f.readline([limit]) Прочитает единственную строку текста и вернет ее. По до- стижении конца файла вернет пустую строку. Аргумент limit определяет максимальное число байтов, какое может быть прочитано. f.write(s) Записывает строку s в поток. Перед записью строка ко- дируется в соответствии с именем кодировки в атрибуте f.encoding StringIO([initial [, encoding [, errors [, newline]]]]) Возвращает объект файла, размещаемого в памяти, обладающий теми же особенностями, что и объект класса TextIOWrapper. В аргументе initial пе- пе- редается строка с начальным содержимым файла. Остальные аргументы имеют тот же смысл, что и в функции TextIOWrapper(). Экземпляр s класса StringIO поддерживает все обычные операции над файлами и дополнитель- но реализует метод s.getvalue(), который возвращает текущее содержимое буфера в памяти. Функция open() Модуль io определяет следующую функцию open(), которая является пол- ным аналогом встроенной функции open() в Python 3: 444 Глава 19. Службы операционной системы open(file [, mode [, buffering [, encoding [, errors [, newline [, closefd]]]]]]) Открывает файл file и возвращает соответствующий ему объект ввода- вывода. В аргументе file может передаваться строка с именем файла или целочисленный дескриптор потока ввода-вывода, который уже был от- крыт. Результатом вызова этой функции является объект одного из классов ввода-вывода, объявленных в модуле io, в зависимости от значений аргу- ментов mode и buffering. Если в аргументе mode указывается один из тексто- вых режимов, таких как ‘r’, ‘w’, ‘a’ или ‘U’, возвращается экземпляр класса TextIOWrapper . Если в аргументе mode указывается двоичный режим, такой как ‘rb’ или ‘wb’, тип результата зависит от значения аргумента buffering. Если аргумент buffering имеет значение 0, возвращается экземпляр класса FileIO , реализующий низкоуровневый ввод-вывод без буферизации. Если аргумент buffering имеет любое другое значение, возвращается экземпляр класса BufferReader, BufferedWriter или BufferedRandom, в зависимости от зна- чения в аргументе mode. Аргументы encoding, errors и newline учитываются, только когда файл открывается в текстовом режиме; они передаются кон- структору класса TextIOWrapper. Значение аргумента closefd учитывается, только если аргумент file представляет собой целочисленный дескриптор, и передается конструктору класса FileIO. Абстрактные базовые классы Модуль io объявляет следующие абстрактные базовые классы, которые можно использовать для проверки типов и объявления новых классов ввода-вывода: Абстрактный класс Описание IOBase Базовый класс для всех классов ввода-вывода. RawIOBase Базовый класс для объектов, поддерживающих низкоуров- невый ввод-вывод двоичных данных. Является производ- ным от класса IOBase. BufferedIOBase Базовый класс для объектов, поддерживающих буферизо- ванный ввод-вывод двоичных данных. Является производ- ным от класса IOBase. TextIOBase Базовый класс для объектов, поддерживающих ввод-вывод текстовых данных. Является производным от класса IOBase Программистам редко приходится работать с этими классами непосред- ственно. Подробное описание их использования можно найти в электрон- ной документации. |