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

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

Этот модуль реализует вспомогательный класс и функции для быстрой организации цикла по стандартному вводу или списку файлов. Если нужно просто прочитать или записать один файл, обратитесь к 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[, mode[, openhook]]]]])
Создаёт экземпляр класса FileInput. Экземпляр будет использоваться как глобальное состояние для функций этого модуля, а также возвращается для использования во время итерации. Параметры этой функции будут переданы конструктору класса FileInput.

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

fileinput.filename()
Возвращает имя файла, который в данный момент читается. До чтения первой строки возвращает None.
fileinput.fileno()
Возвращает целочисленный «файловый дескриптор» текущего файла. Когда файл не открыт (до первой строки и между файлами), возвращает -1.
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[, 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 нельзя использовать вместе.

Необязательная фильтрация на месте: если именованный аргумент 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)

fileinput.hook_encoded(encoding)

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

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