11.9. linecache — Accès direct aux lignes d’un texte

Code source : Lib/linecache.py


Le module linecache permet d’obtenir n’importe quelle ligne d’un fichier source Python. Le cas classique où de nombreuses lignes sont accédées est optimisé en utilisant un cache interne. C’est utilisé par le module traceback pour récupérer les lignes à afficher dans les piles d’appels.

Les fichiers sont ouverts par la fonction tokenize.open(). Cette fonction utilise tokenize.detect_encoding() pour obtenir l’encodage du fichier. En l’absence d’un BOM et d’un cookie d’encodage, c’est l’encodage UTF-8 qui sera utilisé.

Le module linecache définit les fonctions suivantes :

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

Récupère la ligne lineno du fichier filename. Cette fonction ne lévera jamais d’exception, elle préfèrera renvoyer '' en cas d’erreur (le caractère de retour à la ligne sera inclu pour les lignes existantes).

Si le fichier filename n’est pas trouvé, la fonction le cherchera dans les chemins de recherche de modules, sys.path`, après avoir vérifié si un ``__loader__ (de la PEP 302) se trouve dans module_globals, dans le cas où le module a été importé depuis un fichier zip, ou une autre source hors du système de fichier.

linecache.clearcache()

Nettoie le cache. Utilisez cette fonction si vous n’avez plus besoin des lignes des fichiers précédement lus via getline().

linecache.checkcache(filename=None)

Vérifie la validité du cache. Utilisez cette fonction si les fichiers du cache pourraient avoir changé sur le disque, et que vous en voudriez une version à jour. Sans filename, toutes les entrées du cache seront vérifiées.

linecache.lazycache(filename, module_globals)

Récupère suffisament d’informations sur un module situé hors du système de fichiers pour récuperer ses lignes plus tard via getline(), même si module_globals devient None. Cela évite de lire le fichier avant d’avoir besoin d’une ligne, tout en évitant de conserver les globales du module indéfiniment.

Nouveau dans la version 3.5.

Exemples :

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