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

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: Может использоваться как контекстный менеджер.

Следующие функции используют глобальное состояние, созданное 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: Может использоваться как контекстный менеджер.

Опциональная фильтрация на месте: если именованный аргумент inplace=True передан в fileinput.input() или конструктор FileInput, файл перемещается в резервную копию, а стандартный вывод направляется во входной файл (если файл с тем же именем, что и резервная копия, уже существует, он будет молча заменён). Это позволяет написать фильтр, который перезаписывает свой входной файл на месте. Если задан параметр backup (обычно как backup='.<некоторое расширение>'), он определяет расширение резервной копии, и резервная копия сохраняется; по умолчанию расширение – '.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)

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

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