La lecture efficace de lignes spécifiques dans un fichier est cruciale pour de nombreux programmes Python. L’approche optimale dépend fortement de la taille du fichier et de la fréquence d’accès à ces lignes. Ce guide explore plusieurs méthodes, chacune adaptée à différents scénarios.
Table des matières
- Lecture de lignes spécifiques dans les petits fichiers
- Accès efficace aux lignes plusieurs fois
- Traitement efficace des gros fichiers
- Techniques avancées pour les ensembles de données massifs
- Foire aux questions
Lecture de lignes spécifiques dans les petits fichiers
Pour les petits fichiers qui tiennent facilement en mémoire, la méthode readlines()
offre une solution simple. Cette méthode lit toutes les lignes dans une liste, permettant un accès direct via l’indexation.
def read_specific_lines_small_file(filepath, line_numbers):
"""Lit des lignes spécifiques d'un petit fichier.
Args:
filepath: Chemin d'accès au fichier.
line_numbers: Une liste de numéros de ligne (index à partir de 0) à lire.
Returns:
Une liste de chaînes de caractères, contenant les lignes demandées. Renvoie une liste vide si le fichier n'est pas trouvé.
"""
try:
with open(filepath, 'r') as file:
lines = file.readlines()
return [lines[i].strip() for i in line_numbers if 0 <= i < len(lines)]
except FileNotFoundError:
return []
filepath = "my_small_file.txt"
line_numbers_to_read = [0, 2, 4] # Lire les lignes 1, 3 et 5 (index à partir de 0)
lines = read_specific_lines_small_file(filepath, line_numbers_to_read)
for line in lines:
print(line)
Bien que simple, cette approche devient inefficace pour les fichiers plus volumineux.
Accès efficace aux lignes plusieurs fois
Si vous accédez plusieurs fois aux mêmes lignes, le module linecache
offre des gains de performance significatifs en mettant les lignes en cache, ce qui minimise les E/S disque.
import linecache
def read_specific_lines_linecache(filepath, line_numbers):
"""Lit des lignes spécifiques en utilisant linecache (indexation à partir de 1).
Args:
filepath: Chemin d'accès au fichier.
line_numbers: Une liste de numéros de ligne (index à partir de 1) à lire.
Returns:
Une liste de chaînes de caractères, contenant les lignes demandées. Renvoie une liste vide si le fichier n'est pas trouvé ou si les lignes sont hors limites.
"""
lines = [linecache.getline(filepath, line_number).strip() for line_number in line_numbers if linecache.getline(filepath, line_number)]
return lines
filepath = "my_file.txt"
line_numbers_to_read = [1, 3, 5] # Lire les lignes 1, 3 et 5 (index à partir de 1)
lines = read_specific_lines_linecache(filepath, line_numbers_to_read)
for line in lines:
print(line)
Notez que linecache
utilise une indexation à partir de 1.
Traitement efficace des gros fichiers
Pour les gros fichiers, évitez de charger tout en mémoire. Itérez ligne par ligne en utilisant enumerate()
pour suivre les numéros de ligne.
def read_specific_lines_large_file(filepath, line_numbers):
"""Lit des lignes spécifiques d'un gros fichier efficacement.
Args:
filepath: Chemin d'accès au fichier.
line_numbers: Une liste de numéros de ligne (index à partir de 0) à lire.
Returns:
Une liste de chaînes de caractères, contenant les lignes demandées. Renvoie une liste vide si le fichier n'est pas trouvé.
"""
try:
lines_to_return = []
with open(filepath, 'r') as file:
for i, line in enumerate(file):
if i in line_numbers:
lines_to_return.append(line.strip())
return lines_to_return
except FileNotFoundError:
return []
filepath = "my_large_file.txt"
line_numbers_to_read = [100, 500, 1000] # Lire les lignes 101, 501 et 1001 (index à partir de 0)
lines = read_specific_lines_large_file(filepath, line_numbers_to_read)
for line in lines:
print(line)
Cette méthode est efficace en termes de mémoire pour les fichiers volumineux.
Techniques avancées pour les ensembles de données massifs
Pour les fichiers exceptionnellement volumineux dépassant la RAM disponible, envisagez les fichiers mappés en mémoire ou des bibliothèques spécialisées comme dask
ou vaex
, conçues pour gérer les ensembles de données qui ne tiennent pas en mémoire.
Foire aux questions
- Q : Que se passe-t-il si un numéro de ligne est hors limites ? Les méthodes fournies gèrent les numéros de ligne hors limites en les omettant simplement.
- Q : Puis-je lire des lignes en fonction d’une condition au lieu d’un numéro de ligne ? Oui, remplacez la vérification du numéro de ligne par une instruction conditionnelle (par exemple :
if "mot-clé" in line:
).