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 будет используемый несколько раз, то второе и дальнейшее использование будет линии возвращает no, кроме, возможно, для интерактивного использования, или если это было явно перезагружено (например, использующий sys.stdin.seek(0)).

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

Линии - возвращенныйwith любой newlines неповрежденный, что означает, что у последней линии в файле может не быть того.

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

Возвращает целое число «file дескриптор» для текущего файла. Если файл не открыт (перед первой строкой и между файлами), возвращает значение -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.