PYTHON → ROBOTIQUE · 07

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 : Truetrue, Nonenull, 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, valeur

Ré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

MotDéfinition
UnicodeTable qui attribue un numéro à chaque caractère.
UTF-8Encodage qui transforme ces numéros en octets.
with open(...)Ouvre un fichier et garantit sa fermeture.
Mode w / a / rÉcrire (efface) / ajouter / lire.
CSVTableau texte, une ligne par enregistrement, colonnes séparées par des virgules.
JSONFormat texte pour des structures imbriquées.
PathChemin 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

Documentation

Méthodes des chaînes · Lire et écrire des fichiers · csv · json

← Séance 06SommaireSéance 08 : Erreurs, tests et débogage →