HOWTO · Python
Comment lire un fichier ligne par ligne dans une liste en Python
Ce tutoriel présente comment lire un fichier ligne par ligne dans une liste en Python
Sur cette page
Pour convertir un fichier texte en liste, choisissez une méthode selon que vous devez conserver les fins de ligne et selon la quantité de données que la mémoire peut accueillir. Ouvrez les fichiers texte avec un encodage explicite afin que Python décode leurs octets de manière cohérente. Les exemples ci-dessous créent eux-mêmes un petit fichier; vous pouvez donc les adapter sans dépendre d’un chemin particulier.
Utiliser readlines() pour créer une liste de lignes
La méthode readlines() lit le reste du flux et renvoie une liste contenant une chaîne par ligne. En mode texte, les caractères de fin de ligne sont généralement conservés dans ces chaînes. Par défaut, la gestion universelle des fins de ligne de Python convertit les fins de ligne courantes en \n; une dernière ligne qui n’en comporte pas reste sans caractère de fin. La liste contient donc le texte ainsi que les fins de ligne présentes dans le fichier.
Exécutez cet exemple autonome pour créer une liste en conservant les caractères de nouvelle ligne renvoyés par readlines() :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as directory:
path = Path(directory) / "notes.txt"
path.write_text("Line One: 1\nLine Two: 2\nLine Three: 3\n", encoding="utf-8")
with path.open("r", encoding="utf-8") as file:
lines = file.readlines()
print(lines)
Pour obtenir le texte sans son saut de ligne, appliquez rstrip("\n") à chaque chaîne. Cette méthode supprime les caractères de saut de ligne à la fin tout en préservant les espaces et les tabulations qui peuvent faire partie du contenu. Évitez de supprimer tous les espaces blancs, sauf si cela fait partie de votre règle de nettoyage des données.
Parcourir le fichier pour éviter de charger toutes les lignes à la fois
Il est possible de parcourir directement un objet fichier texte. La lecture se fait alors ligne par ligne, sans créer au préalable la liste supplémentaire de toutes les lignes que renvoie readlines(). Toutefois, si vous ajoutez chaque ligne à une liste de résultats, cette liste conserve le texte de tout le fichier et sa mémoire augmente proportionnellement à la taille de celui-ci.
L’exemple suivant crée la liste demandée en supprimant uniquement le suffixe de saut de ligne de chaque ligne :
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as directory:
path = Path(directory) / "notes.txt"
path.write_text("Line One: 1\nLine Two: 2\nLine Three: 3\n", encoding="utf-8")
with path.open("r", encoding="utf-8") as file:
lines = [line.rstrip("\n") for line in file]
print(lines)
Si le fichier est trop volumineux pour être conservé dans une liste, traitez chaque ligne à l’intérieur du bloc with au lieu de l’ajouter à une liste. Vous pouvez, par exemple, vérifier une condition, mettre à jour un compteur cumulatif ou écrire les données transformées dans un autre fichier. Ce traitement en flux évite de garder simultanément toutes les lignes d’entrée en mémoire, même si les autres structures de données utilisées par l’opération en consomment toujours.
Utiliser read().splitlines() lorsque le fichier tient en mémoire
Appeler read() sans préciser de taille lit le contenu depuis la position actuelle jusqu’à la fin du fichier (EOF) et renvoie une chaîne. Appeler splitlines() sur cette chaîne crée une liste de ses lignes. Par défaut, splitlines() supprime les séparateurs de ligne; passez keepends=True pour les conserver. Comme la chaîne complète existe avant la création de la liste, cette méthode peut temporairement garder en mémoire à la fois le texte du fichier et la liste des éléments obtenus.
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as directory:
path = Path(directory) / "notes.txt"
path.write_text("Line One: 1\nLine Two: 2\nLine Three: 3\n", encoding="utf-8")
with path.open("r", encoding="utf-8") as file:
lines_without_endings = file.read().splitlines()
with path.open("r", encoding="utf-8") as file:
lines_with_endings = file.read().splitlines(keepends=True)
print(lines_without_endings)
print(lines_with_endings)
Choisir une méthode selon la mémoire disponible et les fins de ligne
Utilisez readlines() si vous souhaitez obtenir une liste et qu’il est utile d’y conserver chaque fin de ligne. Parcourez le fichier pour traiter les données progressivement ou pour éviter une liste intermédiaire supplémentaire lorsque vous devez tout de même créer une liste. Choisissez read().splitlines() si le fichier tient largement en mémoire et que vous préférez obtenir simplement des chaînes sans leurs fins de ligne; définissez keepends=True si ces fins doivent être conservées.
Aucune méthode ne permet de stocker gratuitement une liste complète : les chaînes et la structure de la liste occupent de la mémoire. Si le fichier est si volumineux que la création de la liste demandée risque de provoquer une MemoryError, traitez chaque ligne au fur et à mesure au lieu de toutes les accumuler. Ces méthodes ont des comportements différents en matière de mémoire et de fins de ligne; choisissez selon le résultat attendu plutôt que de supposer que l’une est toujours plus rapide.