fileinput — Итерация по строкам из нескольких потоков ввода
Исходный код: Lib/fileinput.py
Этот модуль предоставляет вспомогательный класс и функции, позволяющие быстро написать цикл для чтения стандартного ввода или списка файлов. Если вам нужно прочитать или записать только один файл, см. open().
Типичное использование:
import fileinput
for line in fileinput.input(encoding="utf-8"):
process(line)
Этот код перебирает строки всех файлов, перечисленных в sys.argv[1:]; если список пуст, используется sys.stdin. Если имя файла — '-', оно также заменяется на sys.stdin, а необязательные аргументы mode и openhook игнорируются. Чтобы указать другой список имён файлов, передайте его первым аргументом в input(). Также можно указать одно имя файла.
По умолчанию все файлы открываются в текстовом режиме, но это можно изменить, указав параметр mode при вызове input() или FileInput. Если при открытии или чтении файла возникает ошибка ввода-вывода, возбуждается исключение OSError.
Изменено в версии 3.3: Ранее возбуждалось исключение IOError; теперь оно является псевдонимом OSError.
Если sys.stdin используется более одного раза, при втором и последующих вызовах строки возвращаться не будут, за исключением, возможно, интерактивного использования или случаев, когда состояние было явно сброшено (например, с помощью sys.stdin.seek(0)).
Пустые файлы открываются и сразу закрываются; их наличие в списке имён файлов заметно только в том случае, если последним открытым файлом оказался пустой файл.
Строки возвращаются с сохранением символов новой строки, поэтому последняя строка файла может не содержать символа новой строки.
Управлять способом открытия файлов можно с помощью хука открытия, переданного через параметр openhook в fileinput.input() или FileInput(). Хук должен быть функцией, принимающей два аргумента — filename и mode — и возвращающей соответствующим образом открытый файловый объект. Если заданы encoding и/или errors, они будут переданы хуку в качестве дополнительных именованных аргументов. Этот модуль предоставляет hook_compressed() для работы со сжатыми файлами.
Основной интерфейс этого модуля — следующая функция:
-
fileinput.input(files=None, inplace=False, backup='', *, mode='r', openhook=None, encoding=None, errors=None) -
Создаёт экземпляр класса
FileInput. Экземпляр будет использоваться в качестве глобального состояния для функций этого модуля, а также возвращается для использования при итерации. Параметры этой функции передаются конструктору классаFileInput.Экземпляр
FileInputможно использовать как менеджер контекста в инструкцииwith. В этом примере input закрывается после выхода из инструкцииwith, даже если возникает исключение:with fileinput.input(files=('spam.txt', 'eggs.txt'), encoding="utf-8") as f: for line in f: process(line)Изменено в версии 3.2: Можно использовать как менеджер контекста.
Изменено в версии 3.8: Именованные параметры mode и openhook теперь доступны только как именованные аргументы.
Изменено в версии 3.10: Добавлены параметры encoding и errors, доступные только как именованные аргументы.
Следующие функции используют глобальное состояние, созданное вызовом 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, encoding=None, errors=None) -
Класс
FileInputреализует эту функциональность; его методыfilename(),fileno(),lineno(),filelineno(),isfirstline(),isstdin(),nextfile()иclose()соответствуют одноимённым функциям модуля. Кроме того, он является итерируемым объектом и имеет методreadline(), возвращающий следующую строку ввода. Доступ к последовательности должен осуществляться строго по порядку; произвольный доступ и вызовыreadline()нельзя смешивать.С помощью mode можно указать режим файла, который будет передан в
open(). Он должен быть равен'r'или'rb'.Если задан openhook, он должен быть функцией, принимающей два аргумента — filename и mode — и возвращающей соответствующим образом открытый файловый объект. Нельзя использовать одновременно inplace и openhook.
Можно указать encoding и errors, которые будут переданы в
open()или openhook.Экземпляр
FileInputможно использовать как менеджер контекста в инструкцииwith. В этом примере input закрывается после выхода из инструкцииwith, даже если возникает исключение:with FileInput(files=('spam.txt', 'eggs.txt')) as input: process(input)Изменено в версии 3.2: Можно использовать как менеджер контекста.
Изменено в версии 3.8: Параметры mode и openhook теперь доступны только как именованные аргументы.
Изменено в версии 3.10: Добавлены параметры encoding и errors, доступные только как именованные аргументы.
Изменено в версии 3.11: Режимы
'rU'и'U', а также метод__getitem__()удалены.
Необязательная фильтрация на месте: если аргумент inplace=True передан в fileinput.input() или конструктор FileInput, файл перемещается в резервную копию, а стандартный вывод перенаправляется в исходный файл (если файл с таким же именем, как у резервной копии, уже существует, он будет заменён без предупреждения). Это позволяет написать фильтр, который перезаписывает входной файл на месте. Если задан параметр backup (обычно в виде backup='.<some extension>'), он указывает расширение резервной копии, которая сохраняется; по умолчанию используется расширение '.bak', и резервная копия удаляется при закрытии выходного файла. Фильтрация на месте отключена при чтении стандартного ввода.
Этот модуль предоставляет следующие два хука открытия:
-
fileinput.hook_compressed(filename, mode, *, encoding=None, errors=None) -
Прозрачно открывает файлы, сжатые с помощью gzip и bzip2 (определяемые по расширениям
'.gz'и'.bz2'), используя модулиgzipиbz2. Если расширение имени файла не равно'.gz'или'.bz2', файл открывается обычным способом (то есть с помощьюopen(), без распаковки).Значения encoding и errors передаются в
io.TextIOWrapperдля сжатых файлов и в open для обычных файлов.Пример использования:
fi = fileinput.FileInput(openhook=fileinput.hook_compressed, encoding="utf-8")Изменено в версии 3.10: Добавлены параметры encoding и errors, доступные только как именованные аргументы.
-
fileinput.hook_encoded(encoding, errors=None) -
Возвращает хук, который открывает каждый файл с помощью
open(), используя заданные значения encoding и errors для чтения файла.Пример использования:
fi = fileinput.FileInput(openhook=fileinput.hook_encoded("utf-8", "surrogateescape"))Изменено в версии 3.6: Добавлен необязательный параметр errors.
Устарело с версии 3.10: Эта функция устарела, поскольку
fileinput.input()иFileInputтеперь имеют параметры encoding и errors.
© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/fileinput.html