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=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', и оно удаляется при закрытии выходного файла. Фильтрация на месте отключается при чтении стандартного ввода.
Примечание
Текущая реализация не работает для файловых систем 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"))