> **Источник:** https://python-all.ru/3.0/library/fileinput.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# `fileinput` – Итерация по строкам из нескольких входных потоков

Этот модуль реализует вспомогательный класс и функции для быстрой организации цикла по стандартному вводу или списку файлов. Если нужно просто прочитать или записать один файл, обратитесь к [`open()`](https://python-all.ru/3.0/library/functions.html#open).

Типичное использование:

```python
import fileinput
for line in fileinput.input():
    process(line)
```

Эта функция выполняет итерацию по строкам всех файлов, перечисленных в `sys.argv[1:]`, используя по умолчанию `sys.stdin`, если список пуст. Если имя файла равно `'-'`, оно также заменяется на `sys.stdin`. Чтобы указать альтернативный список имён файлов, передайте его первым аргументом в [`input()`](https://python-all.ru/3.0/library/fileinput.html#fileinput.input). Допускается и одно имя файла.

По умолчанию все файлы открываются в текстовом режиме, но это можно изменить, указав параметр *mode* в вызове [`input()`](https://python-all.ru/3.0/library/fileinput.html#fileinput.input) или [`FileInput()`](https://python-all.ru/3.0/library/fileinput.html#fileinput.FileInput). Если при открытии или чтении файла возникает ошибка ввода-вывода, возбуждается [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError).

Если `sys.stdin` используется более одного раза, второй и последующие вызовы не вернут ни одной строки, за исключением, возможно, интерактивного использования или если он был явно сброшен (например, с помощью `sys.stdin.seek(0)`).

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

Строки возвращаются с сохранением всех символов новой строки; это означает, что последняя строка в файле может не иметь такого символа.

Можно управлять тем, как открываются файлы, передав открывающий хук через параметр *openhook* в [`fileinput.input()`](https://python-all.ru/3.0/library/fileinput.html#fileinput.input) или [`FileInput()`](https://python-all.ru/3.0/library/fileinput.html#fileinput.FileInput). Хук должен быть функцией, которая принимает два аргумента: *filename* и *mode*, и возвращает соответствующим образом открытый файлоподобный объект. Два полезных хука уже предоставлены этим модулем.

Следующая функция является основным интерфейсом этого модуля:

#### `[fileinput.input]fileinput.input([files[, inplace[, backup[, mode[, openhook]]]]])`

Создаёт экземпляр класса

[`FileInput`](https://python-all.ru/3.0/library/fileinput.html#fileinput.FileInput)

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

[`FileInput`](https://python-all.ru/3.0/library/fileinput.html#fileinput.FileInput)

.

Следующие функции используют глобальное состояние, созданное [`fileinput.input()`](https://python-all.ru/3.0/library/fileinput.html#fileinput.input); если активного состояния нет, вызывается [`RuntimeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.RuntimeError).

#### `[fileinput.filename]fileinput.filename()`

Возвращает имя файла, который в данный момент читается. До чтения первой строки возвращает

`None`

.

#### `[fileinput.fileno]fileinput.fileno()`

Возвращает целочисленный «файловый дескриптор» текущего файла. Когда файл не открыт (до первой строки и между файлами), возвращает

`-1`

.

#### `[fileinput.lineno]fileinput.lineno()`

Возвращает накопленный номер строки для только что прочитанной строки. До чтения первой строки возвращает

`0`

. После чтения последней строки последнего файла возвращает номер этой строки.

#### `[fileinput.filelineno]fileinput.filelineno()`

Возвращает номер строки в текущем файле. До чтения первой строки возвращает

`0`

. После чтения последней строки последнего файла возвращает номер этой строки внутри файла.

#### `[fileinput.isfirstline]fileinput.isfirstline()`

Возвращает true, если только что прочитанная строка является первой строкой своего файла, в противном случае возвращает false.

#### `[fileinput.isstdin]fileinput.isstdin()`

Возвращает true, если последняя строка была прочитана из

`sys.stdin`

, иначе false.

#### `[fileinput.nextfile]fileinput.nextfile()`

Закрывает текущий файл, чтобы следующая итерация начала чтение с первой строки следующего файла (если такой есть); строки, не прочитанные из файла, не учитываются в общем количестве строк. Имя файла не изменяется до тех пор, пока не будет прочитана первая строка следующего файла. До чтения первой строки эта функция не действует; её нельзя использовать для пропуска первого файла. После чтения последней строки последнего файла эта функция также не действует.

#### `[fileinput.close]fileinput.close()`

Закрывает последовательность.

Класс, реализующий поведение последовательности, предоставляемое модулем, также доступен для создания подклассов:

#### `[fileinput.FileInput]class fileinput.FileInput([files[, inplace[, backup[, mode[, openhook]]]]])`

Класс [`FileInput`](https://python-all.ru/3.0/library/fileinput.html#fileinput.FileInput) – это реализация; его методы [`filename()`](https://python-all.ru/3.0/library/fileinput.html#fileinput.filename), [`fileno()`](https://python-all.ru/3.0/library/fileinput.html#fileinput.fileno), [`lineno()`](https://python-all.ru/3.0/library/fileinput.html#fileinput.lineno), [`filelineno()`](https://python-all.ru/3.0/library/fileinput.html#fileinput.filelineno), [`isfirstline()`](https://python-all.ru/3.0/library/fileinput.html#fileinput.isfirstline), [`isstdin()`](https://python-all.ru/3.0/library/fileinput.html#fileinput.isstdin), [`nextfile()`](https://python-all.ru/3.0/library/fileinput.html#fileinput.nextfile) и [`close()`](https://python-all.ru/3.0/library/fileinput.html#fileinput.close) соответствуют одноимённым функциям модуля. Кроме того, у него есть метод `readline()`, который возвращает следующую строку ввода, и метод [`__getitem__()`](https://python-all.ru/3.0/reference/datamodel.html#object.__getitem__), который реализует поведение последовательности. К последовательности необходимо обращаться строго последовательно; произвольный доступ и `readline()` несовместимы.

С помощью *mode* можно указать, какой режим файла будет передан в [`open()`](https://python-all.ru/3.0/library/functions.html#open). Он должен быть одним из `'r'`, `'rU'`, `'U'` и `'rb'`.

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

**Необязательная фильтрация на месте:** если именованный аргумент `inplace=1` передаётся в [`fileinput.input()`](https://python-all.ru/3.0/library/fileinput.html#fileinput.input) или в конструктор [`FileInput`](https://python-all.ru/3.0/library/fileinput.html#fileinput.FileInput), файл перемещается в резервную копию, а стандартный вывод направляется во входной файл (если файл с тем же именем, что и резервная копия, уже существует, он будет заменён бесшумно). Это позволяет написать фильтр, который перезаписывает входной файл на месте. Если задан параметр *backup* (обычно как `backup='.<some extension>'`), он определяет расширение для резервной копии, и резервная копия остаётся; по умолчанию расширение – `'.bak'` и оно удаляется, когда выходной файл закрывается. Фильтрация на месте отключается при чтении стандартного ввода.

> **Предупреждение**
>
> Текущая реализация не работает для файловых систем MS-DOS 8+3.

Следующие два хука открытия предоставляются этим модулем:

#### `[fileinput.hook_compressed]fileinput.hook_compressed(filename, mode)`

Прозрачно открывает файлы, сжатые с помощью gzip и bzip2 (распознаваемые по расширениям `'.gz'` и `'.bz2'`), используя модули [`gzip`](https://python-all.ru/3.0/library/gzip.html#module-gzip) и [`bz2`](https://python-all.ru/3.0/library/bz2.html#module-bz2). Если расширение файла не `'.gz'` и не `'.bz2'`, файл открывается обычным образом (т.е. с помощью [`open()`](https://python-all.ru/3.0/library/functions.html#open) без распаковки).

Пример использования: `fi = fileinput.FileInput(openhook=fileinput.hook_compressed)`

#### `[fileinput.hook_encoded]fileinput.hook_encoded(encoding)`

Возвращает хук, который открывает каждый файл с помощью [`codecs.open()`](https://python-all.ru/3.0/library/codecs.html#codecs.open), используя заданную *кодировку* для чтения файла.

Пример использования: `fi = fileinput.FileInput(openhook=fileinput.hook_encoded("iso-8859-1"))`
