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
.
Якщо 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 methodsfilename()
,fileno()
,lineno()
,filelineno()
,isfirstline()
,isstdin()
,nextfile()
andclose()
correspond to the functions of the same name in the module. In addition it is iterable and has areadline()
method which returns the next input line. The sequence must be accessed in strictly sequential order; random access andreadline()
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.