linecache — Произвольный доступ к строкам текста


Модуль linecache получает любую строку из исходного файла Python, пытаясь при этом выполнить внутреннюю оптимизацию с обращением к кешу, что случается часто, когда из одного файла считывается несколько строк. Он используется модулем traceback для извлечения исходных строк для включения в отформатированную трассировку.

Используется функция tokenize.open() для открытия файлов. Данная функция использует tokenize.detect_encoding() для получения кодировки файла; при отсутствии токена кодировки по умолчанию используется кодировка UTF-8.

Модуль linecache определяет следующие функции:

linecache.getline(filename, lineno, module_globals=None)

Получает строку lineno из файла с именем filename. Данная функция никогда не вызовет исключение, — она возвращает '' при ошибках (для найденных строк будет включён завершающий символ новой строки).

Если файл с именем filename не найден, функция сначала проверяет PEP 302 __loader__ в module_globals. Если такой загрузчик есть и он определяет метод get_source, то он определяет исходные строки (если get_source() возвращает None, то возвращается ''). Наконец, если filename является относительным именем файла, он ищется относительно записей в пути поиска модуля, sys.path.

linecache.clearcache()

Очищает кеш. Используйте эту функцию, если вам больше не нужны строки из файлов, ранее прочитанных с помощью getline().

linecache.checkcache(filename=None)

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

linecache.lazycache(filename, module_globals)

Собирает достаточно подробностей о нефайловом модуле, чтобы позволить получить его строки позже через getline(), даже если module_globals будет None в более позднем вызове. Позволяет избежать ввода-вывода до тех пор, пока строка действительно не понадобится, без необходимости бесконечного переноса глобальных переменных модуля.

Добавлено в версии 3.5.

Пример:

>>> import linecache
>>> linecache.getline(linecache.__file__, 8)
'import sys\n'