HOWTO · Python
Lire un fichier texte dans une liste en Python
Ce tutoriel montre comment lire un fichier texte, dans une liste python.
Sur cette page
Pour lire un fichier texte dans une liste Python, commencez par décider ce que chaque élément doit représenter : une ligne physique, un champ délimité, un enregistrement ou une valeur numérique. Pour du texte ordinaire, readlines() construit sa liste de chaînes, une par ligne, au fil de la lecture ; les fins de ligne sont conservées lorsqu’elles sont présentes. En revanche, read() suivi de splitlines() conserve le texte complet du fichier, puis crée une liste de chaînes correspondant aux lignes, sans leurs fins de ligne. Si vous devez seulement traiter un gros fichier, parcourez-le au lieu de stocker toutes ses lignes.
Les exemples ci-dessous créent chacun un petit fichier d’entrée. Pour les adapter, remplacez le chemin temporaire par celui de votre fichier. Ils sont donnés à titre d’illustration et n’ont pas été exécutés pendant cette étape de rédaction.
Lire les lignes avec readlines()
readlines() renvoie une liste dont les éléments sont les lignes du fichier. Lorsqu’une fin de ligne est présente, elle est généralement incluse dans la chaîne ; elle peut donc apparaître sous la forme \n lors de l’affichage de la liste. Le gestionnaire de contexte ferme le fichier une fois la liste construite.
Exécutez cet exemple :
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("First line\nSecond line\nThird line\n", encoding="utf-8")
with path.open(encoding="utf-8") as file:
lines = file.readlines()
print(lines)
La liste obtenue contient toutes les lignes en mémoire, fins de ligne comprises. Cette méthode est pratique pour les petits fichiers lorsque vous devez conserver chaque chaîne de ligne d’origine. Pour traiter un gros fichier, utilisez la boucle présentée dans la section consacrée aux gros fichiers au lieu de stocker chaque ligne.
Lire et nettoyer les lignes avec une compréhension de liste
Parcourir un fichier texte permet de le lire une ligne à la fois. Une compréhension de liste peut transformer ces lignes en liste, tandis que rstrip("\r\n") supprime les caractères de fin de ligne sans retirer les espaces qui font partie du texte.
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) / "names.txt"
path.write_text(" Ada \nLin\n", encoding="utf-8")
with path.open(encoding="utf-8") as file:
names = [line.rstrip("\r\n") for line in file]
print(names)
strip() est une autre possibilité, mais cette méthode supprime les espaces des deux côtés, y compris ceux qui sont significatifs dans une ligne. Même si la compréhension lit le fichier progressivement, la liste finale conserve toutes les chaînes nettoyées en mémoire. Utilisez cette méthode lorsque vous avez besoin d’une liste et que le fichier tient dans la mémoire disponible.
Lire tout le fichier et le diviser en lignes
Utilisez read() suivi de splitlines() lorsque vous devez disposer du texte complet avant de le diviser en lignes. splitlines() reconnaît les séparateurs de ligne courants et ne les conserve pas dans les chaînes renvoyées.
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) / "poem.txt"
path.write_text("Red\nBlue\nGold\n", encoding="utf-8")
with path.open(encoding="utf-8") as file:
content = file.read()
lines = content.splitlines()
print(lines)
La chaîne complète et la liste obtenue occupent toutes deux de la mémoire ; cette méthode convient donc mal aux fichiers très volumineux. Pour traiter les lignes, une compréhension ou une boucle évite de commencer par créer une seconde copie du fichier entier sous forme de chaîne.
Traiter les gros fichiers ligne par ligne
Lorsque chaque enregistrement peut être traité indépendamment, traitez-le dans la boucle de lecture du fichier et ne conservez que l’état nécessaire à la tâche. Cet exemple compte les lignes non vides sans garder le contenu du fichier dans une liste.
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) / "events.txt"
path.write_text("login\nview\nlogout\n", encoding="utf-8")
count = 0
with path.open(encoding="utf-8") as file:
for line in file:
if line.strip():
count += 1
print(count)
L’utilisation de mémoire se limite ainsi à la ligne courante et au petit compteur. Si la tâche nécessite précisément une liste, ajoutez les chaînes traitées dans la boucle, en gardant à l’esprit que la liste grandira avec le fichier : la boucle ne rend pas, à elle seule, une liste complète économe en mémoire. L’ouverture d’un chemin inexistant déclenche FileNotFoundError ; indiquez un chemin valide ou gérez cette erreur si l’application peut s’en remettre.
Diviser du texte délimité avec split()
Pour un format simple qui utilise un délimiteur connu, lisez le texte puis appelez split() avec ce délimiteur. Le résultat est une liste de chaînes, et non de nombres ; le délimiteur est supprimé. Cette méthode convient aux formats prévisibles, comme les valeurs séparées par des deux-points, mais elle ne gère ni les règles de citation du CSV ni les délimiteurs placés dans des champs entre guillemets.
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) / "colors.txt"
path.write_text("red|green|blue", encoding="utf-8")
with path.open(encoding="utf-8") as file:
colors = file.read().split("|")
print(colors)
Les espaces sont conservés, sauf si vous nettoyez explicitement chaque champ. Par exemple, vous pouvez utiliser une compréhension de liste avec field.strip() si les espaces autour des valeurs relèvent de la mise en forme et non des données.
Lire des lignes délimitées avec csv.reader()
Pour des données CSV ou un format similaire, utilisez le module Python csv afin que les délimiteurs entre guillemets et les guillemets échappés soient analysés conformément au format. csv.reader() produit une liste de chaînes par ligne. Convertissez l’itérateur en liste uniquement si vous devez conserver toutes les lignes en mémoire ; le parcourir directement convient aussi aux gros fichiers.
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
import csv
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as directory:
path = Path(directory) / "people.csv"
path.write_text('name,city\n"Doe, Jane",Paris\nAlex,Rome\n', encoding="utf-8")
with path.open(newline="", encoding="utf-8") as file:
rows = list(csv.reader(file))
print(rows)
Chaque ligne reste distincte, y compris l’en-tête si le fichier en contient un. Si vous n’avez besoin que des enregistrements de données, ignorez ou traitez explicitement l’en-tête ; accéder à la première ligne par son indice ne permet pas de lire un fichier à plusieurs lignes. Lors de l’ouverture d’un fichier texte CSV, le module CSV recommande d’utiliser newline="".
Charger des données numériques avec NumPy
Pour des données numériques textuelles disposées en lignes et colonnes régulières, loadtxt() de NumPy peut analyser les valeurs et les placer dans un tableau. NumPy est une dépendance supplémentaire. Le résultat est un tableau, et non une liste Python ; appelez tolist() si vous avez besoin de listes imbriquées ordinaires. Cet exemple suppose un fichier numérique dont le délimiteur est uniforme et qui ne contient pas d’en-tête.
Le code et les libellés ou sorties affichés dans cette section restent en anglais.
from pathlib import Path
from tempfile import TemporaryDirectory
try:
import numpy as np
except ImportError:
print("Install NumPy to run this example.")
else:
with TemporaryDirectory() as directory:
path = Path(directory) / "measurements.csv"
path.write_text("1.5,2.0\n3.5,4.0\n", encoding="utf-8")
values = np.loadtxt(path, delimiter=",")
print(values.tolist())
Utilisez plutôt csv.reader() si les lignes peuvent avoir des longueurs différentes, contenir du texte ou nécessiter les règles de citation du CSV. Choisissez NumPy lorsque les données sont numériques et que les opérations sur les tableaux sont utiles ; son analyseur et sa représentation en tableau diffèrent d’une liste de chaînes correspondant aux lignes.