fileinput — Перебор строк из нескольких входных потоков

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


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

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

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

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

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

Изменено в версии 3.3: Поднимаемое IOError при использовании является алиасом OSError.

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

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

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

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

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

fileinput.input(files=None, inplace=False, backup='', *, 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.8: Ключевые параметры mode и openhook теперь только ключевые.

Следующие функции используют глобальные состояние, созданные 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='', *, 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.8: Поддержка метода __getitem__() устарела.

Изменено в версии 3.8: Ключевой параметр mode и openhook теперь только ключевой.

Дополнительная фильтрация на месте: если ключевой аргумент 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.