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

С помощью mode вы можете указать, какой режим файла будет передан в open(). Это должен быть один из 'r' и '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.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 для сжатых файлов и открываются для обычных файлов.

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

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

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