Image de couverture de Manipuler du texte et des données en Python : regex, JSON et CSV

En un coup d’œil

Temps de lecture

~200 mots/min

Publié

il y a 1 mois

Jun 13, 2026 · Mis à jour Jul 2, 2026

Vues

96

Total depuis le début

Manipuler du texte et des données en Python : regex, JSON et CSV

Presque tout programme concret est, au fond, un traducteur : les données arrivent sous une forme et doivent repartir sous une autre. Un fichier journal devient un rapport, un export de tableur devient des lignes de base de données, une réponse d'API devient des objets exploitables par votre code. Cette leçon présente les trois outils qui couvrent l'immense majorité de ce travail : les expressions régulières pour trouver une structure dans du texte libre, JSON pour le format qu'utilisent les services web et les fichiers de configuration, et CSV pour le format des tableurs et des exports de données. Maîtrisez ces trois-là, et la phrase « pouvez-vous traiter ce fichier » ne vous fera plus jamais peur.

Un avertissement honnête sur les expressions régulières, car la franchise forme mieux que l'enthousiasme : regex est un langage de motifs compact avec une vraie courbe d'apprentissage, et personne ne le retient en entier. Les professionnels que vous admirez connaissent par cœur peut-être une douzaine de briques de base et consultent le reste, à chaque fois, sans honte. Cette leçon enseigne exactement cette douzaine essentielle, et le bac à sable vous permet de tester les motifs en direct, ce qui est vraiment la seule façon dont quiconque a jamais appris les regex.

Ce que vous apprendrez dans la partie 11

  • Les méthodes de chaînes qui résolvent les problèmes de texte sans regex
  • Les briques de base des regex : classes, quantificateurs, ancres et groupes
  • search, findall et sub : les trois fonctions re qui comptent
  • Lire et écrire du JSON avec loads et dumps
  • Bien gérer le CSV avec DictReader et DictWriter
  • Un pipeline complet : CSV brut en entrée, JSON propre en sortie

Remarque

Avant de commencer

Vous avez besoin des dictionnaires et des listes de la partie 5, des fichiers de la partie 7, et idéalement de l'état d'esprit pipeline de la partie 9. Les leçons JSON et CSV de l'application Learn Python accompagnent cette partie.

1. D'abord, les outils que vous avez déjà

N'utilisez les regex qu'en dernier recours, pas en premier. Les chaînes Python embarquent une boîte à outils qui résout la plupart des problèmes textuels courants en un seul appel lisible : strip et ses variantes suppriment les espaces, split et join convertissent entre chaînes et listes, replace substitue, startswith et endswith testent les extrémités, lower normalise la casse, et l'opérateur in trouve des sous-chaînes. Le choix entre find et regex est simple : si vous cherchez un texte littéral, les chaînes suffisent ; si vous cherchez une forme de texte, comme n'importe quelle adresse email ou n'importe quelle date, c'est le domaine des regex.

line = "  Amina Perera <amina@example.com>  "

clean = line.strip()
print(clean.lower().startswith("amina"))   # True
print("@" in clean)                        # True

name_part = clean.split("<")[0].strip()
print(name_part)                           # Amina Perera
print("-".join(["2026", "06", "13"]))      # 2026-06-13

2. Regex : les douze briques de base

Une expression régulière est un motif qui décrit une famille de chaînes. Le vocabulaire qui couvre le travail quotidien : un point correspond à n'importe quel caractère ; \d, \w et \s correspondent à un chiffre, un caractère de mot et un espace blanc, les majuscules signifiant l'inverse ; les crochets définissent votre propre classe de caractères comme [aeiou] ; les quantificateurs disent combien, avec * pour zéro ou plus, + pour un ou plus, ? pour optionnel, et {n,m} pour une plage comptée ; les ancres ^ et $ fixent le motif au début et à la fin ; les parenthèses groupent et capturent ; et la barre verticale signifie ou. Écrivez les motifs sous forme de chaînes brutes, r"...", pour que les barres obliques inversées survivent intactes.

import re

text = "Order #4321 shipped on 2026-06-13 to amina@example.com"

print(re.search(r"\d{4}-\d{2}-\d{2}", text).group())   # 2026-06-13
print(re.findall(r"#\d+", text))                       # ['#4321']

m = re.search(r"(\w+)@([\w.]+)", text)                 # capture groups
print(m.group(1), "at", m.group(2))    # amina at example.com

masked = re.sub(r"\w+@[\w.]+", "[email hidden]", text)
print(masked)

Une subtilité sépare la recherche de la validation, et le motif EMAIL dans le bac à sable ci-dessous en dépend. re.search répond à « cette forme apparaît-elle quelque part dans le texte », ce qui est correct pour l'extraction ; la validation demande « est-ce que toute la chaîne a cette forme », ce qui nécessite les ancres : ^ au début, $ à la fin, ou la fonction pratique re.fullmatch qui implique les deux. Un validateur d'email sans ancres accepte joyeusement « junk amina@example.com junk », un bug qui a été livré en production plus de fois que quiconque ne l'admettra. Extraction : pas d'ancres. Validation : ancres, toujours.

Ces trois fonctions constituent toute l'API quotidienne. re.search trouve la première occurrence n'importe où et renvoie un objet match, ou None, ce qui, après la partie 10, vous reconnaissez comme une union qui réclame une garde. re.findall renvoie toutes les correspondances sous forme de liste de chaînes, ou de tuples quand le motif a des groupes. re.sub remplace les correspondances, un chercher-remplacer propulsé par regex. Les groupes sont le superpouvoir : les parenthèses découpent une correspondance en morceaux nommés, transformant « trouver la date » en « extraire l'année, le mois et le jour » en un seul mouvement.

Point de contrôle

Quel motif correspond à un numéro de téléphone sri-lankais comme 077-1234567 ?

Trois raffinements font passer vos regex de la salle de classe au monde professionnel. Quand un motif est utilisé de façon répétée, compilez-le une fois avec re.compile et réutilisez l'objet, ce qui est plus rapide et donne au motif un nom qui documente l'intention. Les drapeaux ajustent le comportement de correspondance : re.IGNORECASE fait ce qu'il dit, et re.MULTILINE fait que ^ et $ fonctionnent par ligne plutôt que par chaîne entière, essentiel pour analyser des fichiers entiers. Et sachez que les quantificateurs sont gourmands par défaut, correspondant au maximum possible, donc r"<.+>" engloutit du premier crochet angulaire au dernier ; la variante paresseuse .+? s'arrête au premier crochet fermant, et ce seul point d'interrogation fait la différence entre extraire une balise HTML et extraire tout le document.

Publicité

3. JSON : le langage des API

JSON, JavaScript Object Notation, est le format qu'utilisent les services web, les fichiers de configuration et la plupart des outils modernes pour échanger des données structurées. Python l'adopte naturellement car la correspondance est presque directe : les objets JSON deviennent des dicts, les tableaux des listes, et les chaînes, nombres, booléens ainsi que null se traduisent par str, les types numériques, True, False et None. Le module json ne demande que quatre fonctions : loads analyse une chaîne, dumps sérialise vers une chaîne, tandis que load et dump font la même chose directement depuis et vers des fichiers. Le JSON réel est imbriqué, des dicts contenant des listes de dicts, et les compétences acquises dans la Partie 5 vous permettent de le parcourir sans effort.

import json

raw = '{"name": "Amina", "scores": [87, 91], "active": true}'
student = json.loads(raw)
print(student["scores"][1])                  # 91
print(type(student["active"]))               # <class 'bool'>

student["city"] = "Colombo"
print(json.dumps(student, indent=2))         # pretty, share-ready

with open("student.json", "w") as f:         # to a file
    json.dump(student, f, indent=2)
with open("student.json") as f:              # and back
    again = json.load(f)
print(again == student)                      # True: a clean round trip

Deux habitudes distinguent les professionnels. Premièrement, un JSON mal formé lève une exception json.JSONDecodeError, et tout JSON provenant de l'extérieur mérite la protection try abordée dans la Partie 7. Deuxièmement, quand un service vous fournit du JSON imbriqué, explorez-le de manière interactive avant d'écrire du code : chargez-le dans le REPL, inspectez .keys(), descendez d'un niveau, répétez. Cinq minutes de cartographie vous épargnent une heure de chasse aux KeyError, une méthode de travail qui devient un réflexe au moment où vous appelez votre première vraie API dans la Partie 16.

4. CSV : le langage des tableurs

Le CSV est d'une simplicité trompeuse, des lignes de valeurs séparées par des virgules, et c'est là que réside la tromperie : les champs peuvent contenir des virgules entre guillemets, les guillemets sont échappés en les doublant, et des retours à la ligne peuvent se trouver à l'intérieur des champs. N'analysez jamais un CSV avec split(","), car les cas particuliers finiront par vous rattraper. Le module csv les gère tous, et sa variante dictionnaire est celle à apprendre : DictReader utilise la ligne d'en-tête pour vous fournir chaque enregistrement sous forme de dict, et DictWriter fait l'inverse. Soudain, chaque ligne devient la structure de données étiquetée que vous maîtrisez depuis la Partie 5.

import csv

with open("sales.csv", "w", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=["product", "qty", "price"])
    writer.writeheader()
    writer.writerow({"product": "Laptop, 15 inch", "qty": 2, "price": 185000})
    writer.writerow({"product": "Mouse", "qty": 10, "price": 2500})

with open("sales.csv", newline="") as f:
    for row in csv.DictReader(f):
        value = int(row["qty"]) * float(row["price"])
        print(f"{row['product']:18} -> {value:>10,.0f}")

Remarquez la virgule qui survit sans problème à l'intérieur de "Laptop, 15 inch", les guillemets étant gérés de manière transparente dans les deux sens, et un écueil éternel : le CSV vous donne toujours des chaînes, donc les nombres nécessitent les conversions int et float que vous pratiquez depuis la Partie 1, avec la protection try de la Partie 7 lorsque les données ne sont pas fiables. L'argument newline="" dans open est une exigence documentée du module csv ; considérez-le comme faisant partie de l'incantation.

Le module csv prend également en charge les nombreux dialectes de ce format. Les exports séparés par des tabulations ne demandent que delimiter="\t" dans le lecteur, les tableurs européens qui utilisent des points-virgules nécessitent delimiter=";", et les conventions de guillemets inhabituelles disposent d'options correspondantes. Quand un fichier arrive en ressemblant presque à du CSV mais pas tout à fait, résistez à l'envie de l'analyser à la main : ouvrez-le dans un éditeur de texte, identifiez visuellement le délimiteur et les guillemets, puis indiquez-les à DictReader, qui a déjà rencontré tous les dialectes que vous croiserez.

Point de contrôle

Pourquoi line.split(",") est-il une mauvaise façon d'analyser un fichier CSV ?

Publicité

5. Mise en pratique : le traducteur complet

Voici la promesse de la leçon devenue réalité : un pipeline complet qui prend un export CSV mal formé, valide les lignes avec une expression régulière, convertit les types, ignore et signale les lignes défectueuses, puis produit du JSON propre, chaque étape étant construite à partir d'une leçon de ce cours. Cette forme, ingestion, validation, transformation, émission, représente une part substantielle de tout le travail Python rémunéré, et le mini-projet CSV Sales Analyzer de l'application Learn Python est un grand frère de ce programme exact.

Terrain de jeu Python

Étudiez le fonctionnement de la gestion des échecs : l'expression régulière valide la forme, int() valide les nombres, les deux modes d'échec convergent vers un seul except as ValueError, et les rejets sont collectés avec leurs raisons plutôt que d'être simplement écartés, selon la discipline de la Partie 7. Quand ce pipeline gagnera en maturité, la couche de validation deviendra des modèles Pydantic et les formes seront vérifiées de bout en bout ; le cours sur les sorties structurées de notre série avancée apprend même aux modèles de langage à émettre du JSON qui passe ce type de contrôle.

! Erreurs fréquentes à éviter

  • Écrire une expression régulière sans chaîne brute : "\d+" au lieu de r"\d+".

    Les chaînes normales consomment les barres obliques inverses avant que l'expression régulière ne les voie, ce qui casse les motifs de manière imprévisible. Le préfixe r sur chaque motif, sans exception, règle le problème.

  • Appeler .group() sur une recherche qui peut avoir retourné None.

    re.search renvoie Match | None, votre union de la Partie 10. Protégez-vous : m = re.search(...), puis if m: utilisez m.group(). Les vérificateurs le signalent ; les plantages en production leur ont appris à le faire.

  • Recourir à une expression régulière quand une méthode de chaîne est plus lisible.

    if text.startswith("ERROR") bat re.match(r"^ERROR", text) à chaque fois. Les expressions régulières servent pour les formes, pas pour les littéraux ; l'outil le plus simple qui fonctionne remporte les revues de code.

  • Oublier que les champs CSV sont toujours des chaînes.

    row["qty"] est la chaîne "2" tant que vous ne la convertissez pas. Les conversions de type à la frontière, avec try/except pour les données non fiables, font partie de tout lecteur CSV honnête.

? Foire aux questions

Comment apprendre à écrire des motifs d'expressions régulières plus longs ? +

Progressivement, dans un testeur. Construisez le motif bloc par bloc en le confrontant à des échantillons de texte réels, exactement comme dans l'exercice du bac à sable. Personne n'écrit un motif de quarante caractères d'un seul coup ; tout le monde compose et teste.

JSON ou CSV pour les données de mon propre programme ? +

JSON pour les données imbriquées ou typées et la configuration ; CSV quand des humains vont l'ouvrir dans un tableur ou que les données sont naturellement tabulaires. Pour des volumes ou des requêtes sérieux, le projet de la Partie 13 introduit SQLite, la troisième option qui surpasse les deux.

Et les fichiers Excel, .xlsx ? +

C'est le domaine des bibliothèques tierces : openpyxl ou pandas les lisent directement. Souvent, la réponse pragmatique consiste à exporter d'abord en CSV ; tous les outils de tableur le comprennent, et la leçon d'aujourd'hui s'applique alors sans changement.

Y a-t-il un piège JSON avec les types Python ? +

Quelques-uns à connaître : les clés JSON sont toujours des chaînes (les clés numériques de dictionnaire deviennent des chaînes lors de l'aller-retour), les tuples deviennent des listes, et les datetimes nécessitent une conversion avant la sérialisation. Quand une sérialisation échoue, l'erreur nomme précisément le type fautif.

6. Récapitulatif et perspectives

Vous savez désormais traduire entre les trois dialectes de données quotidiens : les méthodes de chaînes pour le texte littéral, un noyau fonctionnel d'expressions régulières avec classes, quantificateurs, ancres et groupes exploités via search, findall et sub, les allers-retours JSON avec le module json, et un CSV robuste avec DictReader et DictWriter, le tout combiné en un pipeline de validation avec un rapport d'erreurs honnête. C'est la leçon que les employeurs testent discrètement en entretien, car c'est la leçon dont le travail quotidien est fait.

Ensuite, le cours aborde le sujet le plus entouré de mystique et le réduit à des décisions simples : Partie 12, la concurrence, où vos programmes apprennent à attendre plusieurs choses à la fois. Avant cela, terminez les trois exercices du bac à sable ci-dessus, et faites les quiz JSON et CSV dans l'application Learn Python ci-dessous ; le programme complet en seize parties se trouve sur le hub de la série.

💡

Astuce de pro

Conservez un fichier patterns.py personnel contenant les expressions régulières que vous avez testées et en lesquelles vous avez confiance, avec un exemple de correspondance en commentaire à côté de chacune. Dans six mois, votre propre douzaine soigneusement choisie surpassera n'importe quelle antisèche sur Internet, car chaque entrée sera une que vous avez réellement comprise un jour.

Icône de l'application Android Learn Python

Pratiquez en mobilité

Learn Python, l'application Android gratuite

Chaque sujet de cette série est également disponible dans l'application : leçons concises, exemples exécutables, quiz, mini-projets et un environnement Python hors ligne qui fonctionne sur votre téléphone.

Bishrul Haq

Written by

Bishrul Haq

Software engineer writing practical tutorials on Laravel, PHP, Python, and the tools behind real projects. More about me

Newsletter

Want more posts like this?

Get practical software notes and tutorials delivered when something new is published.

Pas de spam. Désinscription à tout moment.

Qu’en avez-vous pensé ?

Commentaires

0
Se connecter ou Créer un compte pour participer à la discussion et réagir à cet article.

Aucun commentaire pour l’instant. Soyez la première personne à donner votre avis.

Related posts

Fonctionnalités essentielles de Pandas en Python : astuces et fonctionnalités

Pandas est l'une de mes bibliothèques Python préférées. Elle est très utile pour visualiser les données de manière claire et structurée. De nos jours, Pandas est largement utilisée en science des données, en apprentissage automatique et dans d'autres domaines.

il y a 6 ans

Comment récupérer des données de Twitter avec Tweepy en Python ?

Pour commencer à travailler avec Python, vous devez avoir Python installé sur votre ordinateur. Si ce n’est pas encore fait, rendez-vous sur le site officiel de Python pour l’installer.

il y a 6 ans

Prédire le revenu par habitant des États-Unis avec la régression linéaire

Python permet de prédire et d'analyser des données à l'aide de la régression linéaire. La régression linéaire est l'une des techniques fondamentales de machine learning ou de statistique conçues pour résoudre des problèmes complexes.

il y a 6 ans

Algorithmes de tri essentiels pour les étudiants en informatique

Les algorithmes sont couramment enseignés dans les cursus d'informatique et de génie logiciel, en licence ou en master. Certains les trouvent difficiles à comprendre parce qu'ils les apprennent par cœur.

il y a 6 ans

Python 3.14 pour les projets réels : Free Threading, JIT, t-strings et Zstandard

Ce qui compte vraiment dans Python 3.14 pour la production : les builds officiels sans GIL, le JIT expérimental, les t-strings pour une interpolation sécurisée, Zstandard dans la bibliothèque standard et un plan d'adoption à faible risque.

il y a 1 mois