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

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

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

Ви можете керувати тим, як відкриваються файли, надаючи перехоплювач відкриття через параметр openhook для fileinput.input() або FileInput(). Хук має бути функцією, яка приймає два аргументи, filename і mode, і повертає відповідно відкритий файлоподібний об’єкт. Якщо вказано кодування та/або помилки, вони будуть передані хуку як додаткові аргументи ключового слова. Цей модуль надає 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: Додано лише ключове слово кодування та помилки.

Наступні функції використовують глобальний стан, створений 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 is iterable and has a readline() method which returns the next input line. 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' 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.8: Ключові параметри mode і openhook тепер є лише ключовими словами.

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

Змінено в версії 3.11: The 'rU' and 'U' modes and the __getitem__() method have been removed.

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