Документация Python неофициальный перевод

10.2. fileinput – Итерация по строкам из нескольких входных потоковfileinput – Iterate over lines from multiple input streams

Исходный код: Lib/fileinput.py


Этот модуль реализует вспомогательный класс и функции для быстрого создания цикла по стандартному вводу или списку файлов. Если нужно только прочитать или записать один файл, см. open().

Типичное использование:

import fileinput
for line in fileinput.input():
    process(line)

Эта функция итерируется по строкам всех файлов, перечисленных в sys.argv[1:], по умолчанию используется sys.stdin, если список пуст. Если имя файла равно '-', оно также заменяется на sys.stdin. Чтобы указать альтернативный список имён файлов, передайте его первым аргументом в input(). Допускается также одно имя файла.

Все файлы по умолчанию открываются в текстовом режиме, но это можно изменить, указав параметр mode в вызове input() или FileInput(). Если при открытии или чтении файла происходит ошибка ввода-вывода, возбуждается IOError.

Если sys.stdin используется более одного раза, второй и последующие вызовы не вернут ни одной строки, за исключением, возможно, интерактивного использования или если он был явно сброшен (например, с помощью sys.stdin.seek(0)).

Пустые файлы открываются и сразу закрываются; их присутствие в списке имён файлов становится заметным, только когда последний открытый файл пуст.

Строки возвращаются с сохранением всех символов новой строки; это означает, что последняя строка в файле может не иметь такого символа.

Вы можете управлять тем, как открываются файлы, передав хук открытия через параметр openhook в fileinput.input() или FileInput(). Хук должен быть функцией, принимающей два аргумента: filename и mode, и возвращающей подходящий открытый файлоподобный объект. Этот модуль уже предоставляет два полезных хука.

Следующая функция является основным интерфейсом этого модуля:

fileinput.input([files[, inplace[, backup[, bufsize[, mode[, openhook]]]]]])

Создаёт экземпляр класса FileInput. Этот экземпляр будет использоваться как глобальное состояние для функций этого модуля, а также возвращается для использования во время итерации. Параметры этой функции будут переданы конструктору класса FileInput.

Изменено в версии 2.5: Добавлены параметры mode и openhook.

Изменено в версии 2.7.12: Параметр bufsize больше не используется.

Следующие функции используют глобальное состояние, созданное fileinput.input(); если активное состояние отсутствует, возбуждается RuntimeError.

fileinput.filename()

Возвращает имя файла, который в данный момент читается. До чтения первой строки возвращает None.

fileinput.fileno()

Возвращает целочисленный «файловый дескриптор» текущего файла. Когда файл не открыт (до первой строки и между файлами), возвращает -1.

Новое в версии 2.5.

fileinput.lineno()

Возвращает накопленный номер строки для только что прочитанной строки. До чтения первой строки возвращает 0. После чтения последней строки последнего файла возвращает номер этой строки.

fileinput.filelineno()

Возвращает номер строки в текущем файле. До чтения первой строки возвращает 0. После чтения последней строки последнего файла возвращает номер этой строки внутри файла.

fileinput.isfirstline()

Возвращает true, если только что прочитанная строка является первой строкой своего файла, в противном случае возвращает false.

fileinput.isstdin()

Возвращает true, если последняя строка была прочитана из sys.stdin, в противном случае возвращает false.

fileinput.nextfile()

Закрывает текущий файл, чтобы следующая итерация начала чтение с первой строки следующего файла (если такой есть); строки, не прочитанные из файла, не учитываются в общем количестве строк. Имя файла не изменяется до тех пор, пока не будет прочитана первая строка следующего файла. До чтения первой строки эта функция не действует; её нельзя использовать для пропуска первого файла. После чтения последней строки последнего файла эта функция также не действует.

fileinput.close()

Закрывает последовательность.

Класс, реализующий поведение последовательности, предоставляемое модулем, также доступен для создания подклассов:

class fileinput.FileInput([files[, inplace[, backup[, bufsize[, mode[, openhook]]]]]])

Класс FileInput – это реализация; его методы filename(), fileno(), lineno(), filelineno(), isfirstline(), isstdin(), nextfile() и close() соответствуют функциям с теми же именами в модуле. Кроме того, он имеет метод readline(), который возвращает следующую входную строку, и метод __getitem__(), реализующий поведение последовательности. Последовательность должна обрабатываться строго последовательно; произвольный доступ и readline() не могут смешиваться.

С помощью mode можно указать, какой режим файла будет передан в open(). Это должен быть один из 'r', 'rU', 'U' и 'rb'.

Параметр openhook, если задан, должен быть функцией, принимающей два аргумента: filename и mode, и возвращающей соответствующим образом открытый файлоподобный объект. inplace и openhook нельзя использовать вместе.

Изменено в версии 2.5: Добавлены параметры mode и openhook.

Изменено в версии 2.7.12: Параметр bufsize больше не используется.

Опциональная фильтрация на месте: если именованный аргумент inplace=1 передан в fileinput.input() или в конструктор FileInput, файл перемещается в резервную копию, а стандартный вывод направляется во входной файл (если файл с тем же именем, что и резервная копия, уже существует, он будет заменён бесшумно). Это позволяет написать фильтр, который перезаписывает свой входной файл на месте. Если параметр backup задан (обычно как backup='.<some extension>'), он указывает расширение для файла резервной копии, и файл резервной копии остаётся; по умолчанию расширение равно '.bak' и он удаляется при закрытии выходного файла. Фильтрация на месте отключается при чтении стандартного ввода.

Примечание

Текущая реализация не работает для файловых систем MS-DOS 8+3.

Следующие два хука открытия предоставляются этим модулем:

fileinput.hook_compressed(filename, mode)

Прозрачно открывает файлы, сжатые gzip и bzip2 (распознаваемые по расширениям '.gz' и '.bz2'), с использованием модулей gzip и bz2. Если расширение имени файла не '.gz' и не '.bz2', файл открывается обычным образом (то есть с помощью open() без какого-либо распаковывания).

Пример использования: fi = fileinput.FileInput(openhook=fileinput.hook_compressed)

Новое в версии 2.5.

fileinput.hook_encoded(encoding)

Возвращает хук, который открывает каждый файл с помощью io.open(), используя заданную encoding для чтения файла.

Пример использования: fi = fileinput.FileInput(openhook=fileinput.hook_encoded("iso-8859-1"))

Примечание

С помощью этого хука FileInput может возвращать строки Unicode в зависимости от указанной кодировки.

Новое в версии 2.5.