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(). Хук должен быть функцией, которая принимает два аргумента, имя файла и режим, и возвращает соответственно открытый файлоподобный объект. Если указаны 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(), который возвращает следующую строку ввода, и метод __getitem__(), который реализует поведение последовательности. Доступ к последовательности должен осуществляться в строго последовательном порядке; случайный доступ и readline() нельзя смешивать.

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

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

Вы можете указать кодировку и ошибки, которые передаются в open() или 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 теперь работают только по ключевому слову.

Изменено в версии 3.10: Добавлены параметры encoding и errors, доступные только для ключевого слова.

Опциональная фильтрация на месте: если в 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(), используя заданное кодирование и ошибки для чтения файла.

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

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

Не рекомендуется, начиная с версии 3.10: Эта функция устарела, поскольку fileinput.input() и FileInput теперь имеют параметры encoding и errors.

Вернуться на верх