Séance 07 · Partie A · Python pas à pas
Chaînes
et fichiers.
Les capteurs d’un robot produisent des mesures ; un journal de bord les conserve ; un tableur les analyse. Entre les trois : du texte, et des fichiers.
Durée : 90 min · Objectifs : maîtriser les méthodes de chaînes, comprendre les caractères et l’encodage, lire et écrire des fichiers texte, CSV et JSON.
Ce que vous saurez faire à la fin
- Nettoyer, découper, chercher et reconstruire du texte.
- Expliquer ce qu’est Unicode et pourquoi « é » peut occuper deux octets.
- Écrire un journal de mesures dans un fichier et le relire.
- Charger et sauvegarder des données structurées (CSV, JSON).
Dans cette page, les fichiers sont créés dans un disque virtuel du navigateur : ils disparaissent au rechargement. Sur votre PC, ils apparaîtront dans le dossier du script.
01 / Chaînes
Une chaîne est une séquence… immuable
Immuable, et alors ?
Comme les tuples, les chaînes ne se modifient pas : chaque opération crée une nouvelle chaîne. Conséquence pratique : construire un texte par += dans une boucle de 100 000 tours recopie la chaîne à chaque fois. On préfère accumuler des morceaux dans une liste puis "".join(liste). find renvoie −1 si absent ; index lèverait une erreur.
01 / Chaînes
La boîte à outils
Méthodes qui reviennent tout le temps
strip, split, join, replace, lower, startswith, isdigit. Elles renvoient toutes une nouvelle chaîne (ou une liste) : il faut récupérer le résultat. repr() montre la chaîne « telle qu’on l’écrirait en Python », avec ses guillemets et son \n : très utile pour voir les espaces invisibles.
01 / Chaînes
Caractères spéciaux et chaînes brutes
Sur Windows
Les chemins Windows contiennent des \ : "C:\nom" serait lu « C: + retour à la ligne + om ». D’où les chaînes brutes r"…", ou l’usage de / qui fonctionne aussi sous Windows en Python. Un fichier texte créé sous Windows termine ses lignes par \r\n, sous Linux et macOS par \n : Python gère la conversion en mode texte.
02 / Encodage
Un caractère est un nombre
- Chaque caractère a un numéro Unicode : A = 65, a = 97, é = 233, 🤖 = 129302.
ord()donne le numéro,chr()le caractère.- Les lettres se suivent : A…Z = 65…90. D’où la comparaison alphabétique de la séance 05.
Pour aller plus loin
Le modulo 26 fait « boucler » l’alphabet : Z + 3 = C. Ce code de César est cassable en 25 essais ; avec un décalage différent par lettre (Vigenère) c’est plus dur ; avec une clé aussi longue que le message et jamais réutilisée, c’est incassable (masque jetable). En séance 13 on verra l’arithmétique derrière les vrais chiffrements.
02 / Encodage
Du caractère à l’octet : UTF-8
Pourquoi c’est important
Un fichier ne contient pas des caractères, il contient des octets (séance 01). L’encodage est la règle qui transforme les uns en les autres. UTF-8 est le standard : 1 octet pour l’ASCII (lettres sans accent, chiffres), 2 pour « é », 3 pour « € », 4 pour un emoji. Le dernier exemple montre le célèbre « café » : le fichier était en UTF-8 mais lu en Latin-1. Toujours préciser encoding="utf-8" à l’ouverture d’un fichier. Sur Arduino, un char est un octet : on y utilise l’ASCII pur.
03 / Fichiers
Écrire, puis lire
Les modes et le with
"w" écrit (et efface ce qui existait !), "a" ajoute à la fin, "r" lit (mode par défaut). Le bloc with garantit que le fichier est fermé à la sortie du bloc, même en cas d’erreur ; sans lui, des données peuvent rester dans un tampon et ne jamais atteindre le disque. Parcourir f ligne par ligne avec for ne charge pas tout le fichier en mémoire : c’est ce qui permet de traiter un journal de 10 Go.
03 / Fichiers
Le format CSV : le tableur des roboticiens
Pourquoi le module csv plutôt que split(",") ?
Parce qu’une valeur peut contenir une virgule (« Paris, France ») ou un guillemet, et que le module gère ces cas. DictReader utilise la première ligne comme noms de colonnes. Attention : tout est lu comme du texte, il faut convertir. Ouvrez mesures.csv avec un tableur : c’est le même format. Beaucoup de cartes électroniques envoient leurs données ainsi sur le port série.
03 / Fichiers
JSON : sauvegarder des structures Python
CSV ou JSON ?
CSV : un tableau, des lignes identiques, léger. JSON : des structures imbriquées (dictionnaires, listes), le format de configuration et d’échange sur Internet. Remarquez la traduction : True → true, None → null, tuple → liste. Un fichier JSON se lit dans n’importe quel langage, y compris en C sur un ESP32.
03 / Fichiers
Chemins et dossiers avec pathlib
Pourquoi pathlib ?
Un objet Path représente un chemin de façon portable : / assemble correctement sous Windows comme sous Linux. write_text / read_text suffisent pour les petits fichiers. Pour un vrai projet, on rangera les données dans un dossier dédié, jamais au milieu du code.
04 / Défis
Défi ★ — Nettoyeur de commandes
Consigne
Un opérateur tape des commandes mal formatées : " avance 50 ", "TOURNE -90", "stop". Écrire analyser(texte) qui renvoie un tuple (commande en majuscules, valeur entière ou 0 s’il n’y en a pas). Tester sur les trois exemples.
Correction
def analyser(texte):
morceaux = texte.strip().upper().split()
commande = morceaux[0]
valeur = int(morceaux[1]) if len(morceaux) > 1 else 0
return commande, valeurRésultats : ('AVANCE', 50), ('TOURNE', -90), ('STOP', 0). split() sans argument avale les espaces multiples. Et si le texte est vide ? morceaux[0] plantera : séance 08.
04 / Défis
Défi ★★ — Le journal analysé
Consigne
Le code ci-dessous crée un journal. Écrire ensuite le programme qui le lit et affiche : le nombre de lignes de chaque niveau (INFO, WARN, ERROR), et la liste des messages ERROR avec leur heure. Utiliser un dictionnaire pour compter.
Correction
compte = {}
erreurs = []
with open("robot.log", encoding="utf-8") as f:
for ligne in f:
heure, niveau, message = ligne.rstrip("\n").split(" ", 2)
compte[niveau] = compte.get(niveau, 0) + 1
if niveau == "ERROR":
erreurs.append((heure, message))
for niveau, n in compte.items():
print(f"{niveau:6} {n}")
for heure, message in erreurs:
print(f"À {heure} : {message}")split(" ", 2) ne découpe que sur les deux premiers espaces : le message garde ses espaces internes. Ce genre d’analyse de journal est quotidien pour un ingénieur.
04 / Défis
Défi ★★★ — Esprit prépa : les palindromes et l’analyse de fréquences
Consigne
1. est_palindrome(texte) : vrai si le texte se lit pareil dans les deux sens, en ignorant espaces, ponctuation, accents simples (é → e) et casse. Test : « Ésope reste ici et se repose ».
2. frequences(texte) : renvoie les lettres triées par fréquence décroissante. Appliquer à un texte français d’au moins 300 caractères de votre choix. Quelle est la lettre la plus fréquente ? En quoi cela casse-t-il le code de César ?
Correction et ouverture
ACCENTS = {"é": "e", "è": "e", "ê": "e", "à": "a", "ç": "c", "ù": "u", "ô": "o", "î": "i"}
def normaliser(texte):
t = texte.lower()
for acc, sans in ACCENTS.items():
t = t.replace(acc, sans)
return "".join(c for c in t if c.isalpha())
def est_palindrome(texte):
t = normaliser(texte)
return t == t[::-1]
def frequences(texte):
compte = {}
for c in normaliser(texte):
compte[c] = compte.get(c, 0) + 1
return sorted(compte.items(), key=lambda kv: kv[1], reverse=True)t[::-1] est une tranche avec un pas de −1 : la chaîne à l’envers. En français, la lettre la plus fréquente est E (≈ 15 %), puis A, S, I, N, T. Dans un message chiffré par César, la lettre la plus fréquente est donc presque sûrement E décalé : on lit le décalage directement. Al-Kindi a décrit cette attaque au IXᵉ siècle. Ouverture : avec un dictionnaire de 100 000 mots, combien de palindromes ? (Séance 17 pour le faire vite.)
05 / Vérification
On ouvre un fichier existant avec open("f.txt", "w"). Que devient son contenu ?
Deux questions supplémentaires
1. Que vaut "a,b,,c".split(",") ? ['a', 'b', '', 'c'] : une chaîne vide entre les deux virgules.
2. Pourquoi préciser encoding="utf-8" ? Parce que l’encodage par défaut dépend du système (souvent Latin-1 ou cp1252 sous Windows) : un fichier écrit sur un PC pourrait être illisible sur un autre.
Référence
Les mots à retenir
| Mot | Définition |
|---|---|
| Unicode | Table qui attribue un numéro à chaque caractère. |
| UTF-8 | Encodage qui transforme ces numéros en octets. |
with open(...) | Ouvre un fichier et garantit sa fermeture. |
Mode w / a / r | Écrire (efface) / ajouter / lire. |
| CSV | Tableau texte, une ligne par enregistrement, colonnes séparées par des virgules. |
| JSON | Format texte pour des structures imbriquées. |
Path | Chemin de fichier portable (pathlib). |
Pour continuer
Vos programmes ont maintenant une mémoire
Mais que se passe-t-il quand le fichier n’existe pas, quand l’utilisateur tape n’importe quoi, quand le capteur renvoie du bruit ? Séance suivante : les erreurs, et comment les dompter.
À faire chez soi
- Refaire les défis. Sur votre PC, ouvrir
mesures.csvdans un tableur. - Écrire un programme qui compte les mots d’un fichier texte et affiche les 10 plus fréquents.
- Sauvegarder en JSON une liste de courses saisie avec
input(), puis la recharger au démarrage suivant.
Documentation
Méthodes des chaînes · Lire et écrire des fichiers · csv · json