# Chapitre 14 — Les spécialisations : automatisation, web, data, IA et jeux > **⏱️ Durée estimée** : 8 à 12 heures pour tout parcourir (tu peux aussi ne lire en détail que les domaines qui t'attirent) > > **📋 Prérequis** : avoir terminé le [Chapitre 13 — Tests avec pytest et bonnes pratiques](13-tests-pytest-bonnes-pratiques.md), savoir créer un venv et installer des paquets ([Chapitre 12](12-outils-venv-pip-git.md)), être à l'aise avec les fichiers ([Chapitre 07](07-fichiers-csv-json.md)) et les classes ([Chapitre 10](10-poo-classes-objets.md)). > > **🎯 Objectifs** — À la fin de ce chapitre, tu sauras… > > - **automatiser** des tâches répétitives sur tes fichiers avec `pathlib`, `shutil` et `argparse` ; > - créer une petite **application web** avec Flask et une **API** avec FastAPI ; > - charger, filtrer, résumer des **données** avec pandas et les représenter avec matplotlib ; > - entraîner et évaluer un premier modèle de **machine learning** avec scikit-learn ; > - programmer la **boucle de jeu** d'un mini-jeu avec pygame ; > - choisir une spécialisation et suivre un **parcours d'apprentissage** pour progresser. --- ## Cours Félicitations ! 🎉 Tu maîtrises maintenant les bases de Python : variables, conditions, boucles, structures de données, fonctions, fichiers, exceptions, modules, classes, tests et outils. C'est comme si tu avais appris à lire, écrire et compter. La question devient : **qu'est-ce que tu veux construire ?** Python est un couteau suisse. Le même langage sert à ranger tes photos, faire tourner un site web, analyser des millions de lignes de données, entraîner une intelligence artificielle ou créer un jeu. Chaque domaine a ses propres **bibliothèques**, ses habitudes et ses outils. Ce chapitre est une **visite guidée** de cinq grandes spécialisations. Pour chacune : 1. à quoi ça sert, concrètement ; 2. les bibliothèques clés ; 3. un **exemple complet et fonctionnel** à recopier et lancer ; 4. un mini-parcours pour aller plus loin. > 💡 **Conseil d'organisation** : crée un dossier `specialisations/` avec **un venv par domaine** (`automatisation/`, `web/`, `data/`, `ia/`, `jeux/`). Les bibliothèques de data et d'IA sont volumineuses : inutile de les installer là où tu fais du web. ```bash mkdir -p specialisations/web && cd specialisations/web python3 -m venv .venv # Windows : py -m venv .venv source .venv/bin/activate # Windows : .venv\Scripts\Activate.ps1 ``` ### 1. Automatisation : faire travailler l'ordinateur à ta place #### 1.1 À quoi ça sert ? Toute tâche **répétitive** sur un ordinateur peut probablement être automatisée : renommer 300 photos, trier un dossier « Téléchargements » en désordre, fusionner des fichiers Excel chaque lundi, envoyer un e-mail de rappel, récupérer une information sur un site web tous les matins, sauvegarder un dossier… C'est souvent **la spécialisation la plus rentable pour un débutant** : quelques dizaines de lignes de Python te font gagner des heures, dès maintenant, sans rien installer d'autre que Python. > 🧠 Règle empirique : si tu fais la même manipulation plus de trois fois, ou si elle prend plus de dix minutes, écris un script. #### 1.2 Bibliothèques clés | Bibliothèque | Rôle | Installation | |---|---|---| | `pathlib`, `shutil`, `os` | parcourir, copier, déplacer, renommer des fichiers | incluses dans Python | | `argparse` | créer des commandes avec options (`--aide`, `--executer`…) | incluse | | `csv`, `json`, `zipfile` | lire/écrire des formats courants, compresser | incluses | | `datetime`, `time`, `sched` | dates, attentes, planification simple | incluses | | `subprocess` | lancer d'autres programmes | incluse | | `requests` | télécharger des pages web, appeler des API | `pip install requests` | | `beautifulsoup4` | extraire des informations d'une page HTML (*scraping*) | `pip install beautifulsoup4` | | `openpyxl` | lire/écrire des fichiers Excel `.xlsx` | `pip install openpyxl` | | `pypdf` | lire, fusionner, découper des PDF | `pip install pypdf` | | `Pillow` | redimensionner, convertir des images | `pip install pillow` | | `schedule` | lancer une fonction à heure fixe | `pip install schedule` | | `playwright` / `selenium` | piloter un vrai navigateur | `pip install playwright` | #### 1.3 Exemple complet : trier un dossier par type de fichier Ce script range chaque fichier d'un dossier dans un sous-dossier selon son extension (`Images/`, `Documents/`, `Audio/`…). Par sécurité, il fonctionne d'abord en **mode simulation** : il affiche ce qu'il ferait sans rien toucher. Il faut ajouter `--executer` pour qu'il déplace vraiment les fichiers. Enregistre-le sous `trier_fichiers.py` : ```python """Range les fichiers d'un dossier dans des sous-dossiers selon leur type. Usage : python trier_fichiers.py chemin/du/dossier # simulation python trier_fichiers.py chemin/du/dossier --executer # pour de vrai """ import argparse import shutil from pathlib import Path CATEGORIES = { "Images": {".jpg", ".jpeg", ".png", ".gif", ".webp", ".svg"}, "Documents": {".pdf", ".docx", ".odt", ".txt", ".md", ".xlsx", ".csv"}, "Audio": {".mp3", ".wav", ".flac", ".ogg"}, "Videos": {".mp4", ".mkv", ".avi", ".mov"}, "Archives": {".zip", ".tar", ".gz", ".7z", ".rar"}, "Code": {".py", ".js", ".html", ".css", ".json"}, } def trouver_categorie(fichier: Path) -> str: """Renvoie le nom de la catégorie d'un fichier d'après son extension.""" extension = fichier.suffix.lower() for categorie, extensions in CATEGORIES.items(): if extension in extensions: return categorie return "Autres" def destination_libre(destination: Path) -> Path: """Ajoute un numéro au nom si un fichier du même nom existe déjà.""" if not destination.exists(): return destination compteur = 1 while True: candidat = destination.with_stem(f"{destination.stem}_{compteur}") if not candidat.exists(): return candidat compteur += 1 def trier_dossier(dossier: Path, executer: bool = False) -> dict[str, int]: """Trie les fichiers de dossier. Renvoie le nombre de fichiers par catégorie.""" bilan: dict[str, int] = {} for fichier in sorted(dossier.iterdir()): if not fichier.is_file() or fichier.name.startswith("."): continue # on ignore les sous-dossiers et les fichiers cachés categorie = trouver_categorie(fichier) destination = destination_libre(dossier / categorie / fichier.name) if executer: destination.parent.mkdir(exist_ok=True) shutil.move(fichier, destination) action = "Déplacé" if executer else "[simulation]" print(f"{action} {fichier.name} → {categorie}/") bilan[categorie] = bilan.get(categorie, 0) + 1 return bilan def main() -> None: analyseur = argparse.ArgumentParser(description="Range un dossier par type.") analyseur.add_argument("dossier", type=Path, help="dossier à ranger") analyseur.add_argument( "--executer", action="store_true", help="déplace vraiment les fichiers" ) arguments = analyseur.parse_args() if not arguments.dossier.is_dir(): analyseur.error(f"{arguments.dossier} n'est pas un dossier.") bilan = trier_dossier(arguments.dossier, arguments.executer) print("\nBilan :") for categorie, nombre in sorted(bilan.items()): print(f" {categorie:<10} {nombre} fichier(s)") if __name__ == "__main__": main() ``` **Essaie-le sur un dossier de test**, jamais directement sur tes vrais fichiers la première fois : ```bash mkdir bazar # crée quelques fichiers vides pour tester (macOS / Linux) : touch bazar/vacances.JPG bazar/cv.pdf bazar/chanson.mp3 bazar/script.py bazar/archive.zip bazar/notes.txt bazar/mystere.xyz ``` ```powershell # Windows PowerShell : mkdir bazar "vacances.JPG","cv.pdf","chanson.mp3","script.py","archive.zip","notes.txt","mystere.xyz" | ForEach-Object { New-Item "bazar\$_" } ``` ```bash python trier_fichiers.py bazar # simulation python trier_fichiers.py bazar --executer # pour de vrai python trier_fichiers.py --help # aide générée automatiquement par argparse ``` ```text [simulation] archive.zip → Archives/ [simulation] chanson.mp3 → Audio/ [simulation] cv.pdf → Documents/ [simulation] mystere.xyz → Autres/ [simulation] notes.txt → Documents/ [simulation] script.py → Code/ [simulation] vacances.JPG → Images/ Bilan : Archives 1 fichier(s) Audio 1 fichier(s) Autres 1 fichier(s) Code 1 fichier(s) Documents 2 fichier(s) Images 1 fichier(s) ``` **Ce qu'il faut remarquer :** - `CATEGORIES` est un dictionnaire d'**ensembles** ([chapitre 04](04-structures-de-donnees.md)) : la recherche `extension in extensions` est instantanée. Pour ajouter un type, tu modifies **les données**, pas le code. - `fichier.suffix.lower()` : `.JPG` et `.jpg` sont traités pareil. - `destination_libre` évite d'**écraser** un fichier existant (`photo.jpg` devient `photo_1.jpg`). Avec l'automatisation, une erreur se répète sur des centaines de fichiers : sois prudent ! - `argparse` transforme ton script en véritable **outil en ligne de commande**, avec une aide `--help` gratuite. - Les fonctions `trouver_categorie` et `trier_dossier` sont faciles à tester avec pytest et `tmp_path` ([chapitre 13](13-tests-pytest-bonnes-pratiques.md)). > ⚠️ **Les trois règles de l'automatisation sereine** : 1) toujours un mode simulation ; 2) tester sur une copie ; 3) ne jamais supprimer quand on peut déplacer. #### 1.4 Aller plus loin en automatisation 1. **Fichiers** : renommage en lot, sauvegarde datée d'un dossier dans un `.zip` (`shutil.make_archive`), recherche de doublons (en comparant des empreintes avec `hashlib`). 2. **Bureautique** : fusionner des fichiers Excel avec `openpyxl` (ou pandas), assembler des PDF avec `pypdf`, redimensionner des photos avec `Pillow`. 3. **Web** : télécharger des données avec `requests`, interroger des API publiques (météo, transports…), extraire des informations avec `BeautifulSoup`. Respecte les conditions d'utilisation des sites et ne les surcharge pas de requêtes. 4. **Planification** : lancer tes scripts automatiquement avec le Planificateur de tâches (Windows), `cron` (macOS/Linux) ou la bibliothèque `schedule`. 5. **Lecture recommandée** : le livre *Automate the Boring Stuff with Python* d'Al Sweigart (gratuit en ligne, en anglais) est la référence du domaine. ### 2. Web : créer des sites et des API #### 2.1 À quoi ça sert ? Quand tu ouvres une page web, ton navigateur (le **client**) envoie une **requête HTTP** à un **serveur**, qui renvoie une **réponse** : une page HTML, une image, ou des données au format JSON. ```text Navigateur Serveur Python ───────── ────────────── GET /api/taches ───────▶ cherche les tâches ◀─────── 200 OK [{"id": 1, "titre": "..."}] ``` Python est très utilisé **côté serveur** (le *back-end*) : Instagram, Pinterest ou de nombreux services de grandes entreprises reposent sur Python. Deux types de projets : - un **site web** : le serveur renvoie des pages HTML que l'humain lit dans son navigateur ; - une **API** (*Application Programming Interface*) : le serveur renvoie des **données** (JSON) que d'autres programmes utilisent (une application mobile, un site en JavaScript, un autre script Python…). Vocabulaire indispensable : | Terme | Signification | |---|---| | **Route** (ou *endpoint*) | une adresse du site, comme `/`, `/contact`, `/api/taches/3` | | **Méthode HTTP** | l'intention : `GET` (lire), `POST` (créer), `PUT`/`PATCH` (modifier), `DELETE` (supprimer) | | **Code de statut** | le résultat : `200` OK, `201` créé, `404` introuvable, `422` données invalides, `500` erreur du serveur | | **JSON** | le format de données du web, très proche des dictionnaires Python ([chapitre 07](07-fichiers-csv-json.md)) | | **Template** | un modèle HTML avec des « trous » remplis par Python | #### 2.2 Bibliothèques clés | Framework | Points forts | Pour qui ? | |---|---|---| | **Flask** | minimaliste, simple, très bien documenté | premier site, petits projets, apprendre les bases | | **FastAPI** | moderne, rapide, validation automatique, documentation d'API générée | API, projets qui utilisent les annotations de type ([chapitre 11](11-poo-avancee-heritage-typage.md)) | | **Django** | « piles incluses » : base de données, comptes utilisateurs, interface d'administration | gros sites complets | Autour : `Jinja2` (templates, utilisé par Flask), `SQLAlchemy` ou l'ORM de Django (bases de données), `pydantic` (validation, utilisé par FastAPI), `requests`/`httpx` (appeler des API). #### 2.3 Exemple complet 1 : un site de citations avec Flask ```bash pip install flask ``` Enregistre `app_flask.py` : ```python """Une mini application web de citations avec Flask.""" import random from flask import Flask, jsonify, render_template_string, request app = Flask(__name__) CITATIONS = [ {"auteur": "Victor Hugo", "texte": "La musique, c'est du bruit qui pense."}, { "auteur": "Marie Curie", "texte": "Rien dans la vie n'est à craindre, tout est à comprendre.", }, { "auteur": "Albert Camus", "texte": "Au milieu de l'hiver, j'ai découvert en moi un invincible été.", }, ] PAGE = """
« {{ citation.texte }} »
— {{ citation.auteur }}