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

11.3. 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. Если при открытии или чтении файла происходит ошибка ввода-вывода, возбуждается OSError.

Изменено в версии 3.3: IOError раньше возбуждалось; теперь оно является псевдонимом OSError.

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

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

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

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

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

fileinput.input(files=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)

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

Экземпляр FileInput можно использовать как контекстный менеджер в операторе with. В этом примере input закрывается после выхода из оператора with, даже если возникло исключение:

with fileinput.input(files=('spam.txt', 'eggs.txt')) as f:
    for line in f:
        process(line)

Изменено в версии 3.2: Может использоваться как контекстный менеджер.

Устарело с версии 3.6, будет удалено в версии 3.8: Параметр bufsize.

Следующие функции используют глобальное состояние, созданное 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=None, inplace=False, backup='', bufsize=0, mode='r', openhook=None)

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

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

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

Экземпляр FileInput можно использовать как контекстный менеджер в операторе with. В этом примере input закрывается после выхода из оператора with, даже если возникло исключение:

with FileInput(files=('spam.txt', 'eggs.txt')) as input:
    process(input)

Изменено в версии 3.2: Может использоваться как контекстный менеджер.

Устарело с версии 3.4: Режимы 'rU' и 'U'.

Устарело с версии 3.6, будет удалено в версии 3.8: Параметр bufsize.

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

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

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, errors=None)

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

Пример использования: fi = fileinput.FileInput(openhook=fileinput.hook_encoded("utf-8", "surrogateescape"))

Изменено в версии 3.6: Добавлен необязательный параметр errors.