Сообщить об ошибке.

Класс FileInput() модуля fileinput в Python

Последовательное чтение строк из нескольких файлов

Синтаксис:

import fileinput

fileinput.FileInput(files=None, inplace=False, \
                    backup='', *, mode='r', openhook=None
                    encoding=None, errors=None)

Параметры:

  • files=None - последовательность из имен файлов,
  • inplace=False - перезаписывать файл на месте,
  • backup='' - str, расширение файлов резервной копии,
  • mode='r' - режим чтения последовательности файлов,
  • openhook=None - функция, возвращающая объект в виде файла,
  • encoding=None - кодировка файла (доступно с версии Python 3.10),
  • errors=None - режим обработки ошибок кодировки (доступно с версии Python 3.10).

Возвращаемое значение:

Описание:

Класс FileInput() модуля fileinput возвращает объект FileInput и является реализацией состояния потока строк из последовательности файлов.

С помощью аргумента mode можно указать, какой режим файла будет передан в функцию open().

Это должен быть один из:

  • 'r' - режим чтения текста,
  • 'rb' - режим чтения байтов,
  • 'rU', 'U' - режим чтения текста в Юникоде.

Если аргумент inplace=True, то текущий файл перемещается в файл резервной копии с расширением, переданным в аргумент backup (по умолчанию .bak), а стандартный вывод направляется во входной файл. Если файл резервной копии с таким же именем существует, то он будет заменен без уведомления. Файл резервной копии удаляется при закрытии выходного файла.

Такое поведение позволяет написать фильтр, который перезаписывает свой входной файл на месте. Примером такого фильтра может быть чтение всех файлов проекта и их перезаписывание с удалением комментариев в коде при помощи команды str.startswith('#').

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

Экземпляр класса fileinput.FileInput() может использоваться как менеджер контекста в операторе with.

Изменено в Python 3.8: добавлены ключевые аргументы mode и openhook.

Изменено в Python 3.10: добавлены ключевые аргументы encoding и errors.

Методы объекта FileInput

Методы объекта FileInput полностью соответствуют названиям функций, определяемые этим модулем.

Кроме того, он имеет метод readline(), который возвращает следующую строку ввода, и метод __getitem__(), который реализует поведение последовательности.

Краткое описание методов:

  • FileInput.filename() - имя текущего файла,
  • FileInput.fileno() - дескриптор текущего файла,
  • FileInput.lineno() - совокупный (общий) номер строки,
  • FileInput.filelineno()- номер строки текущего файла,
  • FileInput.isfirstline() - True, если это первая строка текущего файла,
  • FileInput.isstdin() - True, если последняя строка прочитана из sys.stdin,
  • FileInput.nextfile() - читать следующий файл,
  • FileInput.readline() - следующая строка текущего файла,
  • FileInput.__getitem__() - реализует поведение последовательности,
  • FileInput.close() - закрывает поток последовательности файлов,

Примеры:

В примере ввод закрывается после выхода оператора with, даже если возникает исключение:

with FileInput(files=('spam.txt', 'eggs.txt')) as input:
    for line in input:
        process(line)

Пример удаления комментариев в коде во всех файлах проекта, расположенного в определенном каталоге.

Осторожно, оригиналы файлов проекта перезаписываются, а копии файлов с комментариями не остаются!

import fileinput, glob, os

# каталог проекта
path = 'appmy'
# паттерн поиска файлов по расширению
pattern = '**/*.py'

glob_path = os.path.join(path, pattern)
list_files = glob.glob(glob_path, recursive=True)

if list_files:
    with fileinput.FileInput(files=list_files, inplace=True) as fp:
        for line in fp:
            if not line.lstrip().startswith('#'):
                print(line)

При помощи этого модуля так же можно сделать типа консольной утилиты минимизации JavaScript или CSS файлов.