# `fileinput` — Iterate over lines from multiple input streams

Вихідний код: 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))`).

Порожні файли відкриваються і негайно закриваються; єдиний раз, коли їх присутність у списку імен файлів взагалі помітна, це коли останній відкритий файл порожній.

Рядки повертаються з усіма новими рядками, що означає, що останній рядок у файлі може їх не мати.

You can control how files are opened by providing an opening hook via the openhook parameter to `fileinput.input()` or `FileInput()`. The hook must be a function that takes two arguments, filename and mode, and returns an accordingly opened file-like object. If encoding and/or errors are specified, they will be passed to the hook as additional keyword arguments. This module provides a `hook_compressed()` to support compressed files.

Наступна функція є основним інтерфейсом цього модуля:

`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: Додано лише ключове слово кодування та помилки.

Наступні функції використовують глобальний стан, створений `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)

  Class `FileInput` is the implementation; its methods `filename()`, `fileno()`, `lineno()`, `filelineno()`, `isfirstline()`, `isstdin()`, `nextfile()` and `close()` correspond to the functions of the same name in the module. In addition it has a `readline()` method which returns the next input line, and a `__getitem__()` method which implements the sequence behavior. The sequence must be accessed in strictly sequential order; random access and `readline()` cannot be mixed.

  With mode you can specify which file mode will be passed to `open()`. It must be one of `'r'`, `'rU'`, `'U'` and `'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: The `'rU'` and `'U'` modes.

  Застаріло починаючи з версії 3.8: Support for `__getitem__()` method is deprecated.

  Змінено в версії 3.8: Ключові параметри mode і openhook тепер є лише ключовими словами.

  Змінено в версії 3.10: Додано лише ключове слово кодування та помилки.

Додаткова фільтрація на місці: якщо ключовий аргумент `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: Додано лише ключове слово кодування та помилки.

`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.