Spec-Zone.ru › Python 3.9

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

Исходный код: Lib/fileinput.py

Этот модуль реализует вспомогательный класс и функции для быстрого выполнения цикла по стандартному вводу или списку файлов. Если вам нужно только прочитать или записать один файл, см. open().

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

import fileinput
for line in fileinput.input():
    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, и возвращает соответствующий открытый файлоподобный объект. В этом модуле уже предусмотрены две полезные функции-обработчика.

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

fileinput.input(files=None, inplace=False, backup='', *, mode='r', openhook=None)

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

Экземпляр FileInput может использоваться как менеджер контекста в операторе with. В этом примере input будет закрыт после завершения оператора with, даже если произойдёт исключение:

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

Изменено в версии 3.2: Может использоваться как менеджер контекста.

Изменено в версии 3.8: Параметры mode и openhook теперь являются только ключевыми.

Следующие функции используют глобальное состояние, созданное 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)

Класс FileInput — это реализация; его методы filename(), fileno(), lineno(), filelineno(), isfirstline(), isstdin(), nextfile() и close() соответствуют функциям с таким же именем в модуле. Кроме того, он имеет метод readline(), который возвращает следующую строку ввода, и метод __getitem__(), который реализует поведение последовательности. Доступ к последовательности должен осуществляться в строго последовательном порядке; случайный доступ и readline() не могут смешиваться.

С помощью mode вы можете указать, какой режим файла будет передан в open(). Он должен быть одним из 'r', 'rU', 'U' и 'rb'.

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

Экземпляр FileInput может использоваться как менеджер контекста в операторе with. В этом примере input будет закрыт после завершения оператора with, даже если произойдёт исключение:

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

Изменено в версии 3.2: Может использоваться как менеджер контекста.

Устарело начиная с версии 3.4: Режимы 'rU' и 'U'.

Устарело начиная с версии 3.8: Поддержка метода __getitem__() устарела.

Изменено в версии 3.8: Параметры mode и openhook теперь являются только ключевыми.

Необязательное фильтрация на месте: если ключевой аргумент inplace=True передан в fileinput.input() или конструктор FileInput, файл перемещается в резервную копию, а стандартный вывод перенаправляется в входной файл (если файл с таким же именем, как резервная копия, уже существует, он будет заменён без предупреждений). Это позволяет создавать фильтры, которые переписывают входной файл на месте. Если параметр backup задан (обычно как backup='.<some extension>'), он указывает расширение для резервной копии, и резервная копия остаётся; по умолчанию расширение '.bak', и оно удаляется при закрытии выходного файла. Фильтрация на месте отключена при чтении со стандартного ввода.

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

fileinput.hook_compressed(filename, mode)

Прозрачно открывает файлы, сжатые gzip и bzip2 (определяемые по расширениям '.gz' и '.bz2'), используя модули gzip и bz2. Если расширение файла не '.gz' или '.bz2', файл открывается стандартным способом (т. е., с помощью open() без распаковки).

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

fileinput.hook_encoded(encoding, errors=None)

Возвращает обработчик, который открывает каждый файл с помощью open(), используя заданное кодирование и ошибки для чтения файла.

Пример использования: fi = fileinput.FileInput(openhook=fileinput.hook_encoded("utf-8", "surrogateescape"))

Изменено в версии 3.6: Добавлен необязательный параметр errors.

© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/fileinput.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API