Modules, fichiers et données
Cours · informatique (tronc commun des prépas scientifiques), chapitre 4 · prépas scientifiques, tronc commun · le début du chapitre, la suite sur Adloun
4.1 Introduction et motivation
Un langage de programmation ne vit pas seul : autour du noyau de Python gravitent des modules — des boîtes à outils prêtes à l'emploi pour calculer (), simuler (), tracer (). Savoir s'en servir, c'est savoir trois choses : les importer, lire leur documentation, et garder à l'esprit qu'on les utilise en boîte noire — le programme officiel est explicite : aucune connaissance d'un module n'est exigible, mais leur usage accompagné de documentation est attendu.
Ce chapitre met ces outils au service d'un scénario complet et réaliste, celui que tout scientifique rencontre dès sa première séance de laboratoire : lire un fichier de mesures, calculer des statistiques, produire un graphique. Au passage, on découvre que les données du monde réel sont sales — lignes vides, valeurs manquantes, séparateurs variables — et que la discipline du chapitre 1 (spécifier, tester les cas limites) n'est pas un luxe d'école : c'est elle qui fait la différence entre un script qui marche sur l'exemple du cours et un outil qui survit au contact d'un vrai fichier.
4.2 Les modules
4.2.1 Importer
Un module est un ensemble de fonctions et de constantes regroupées sous un nom. Trois formes d'importation :
import math # forme de référence : on écrit math.sqrt(2)
import matplotlib.pyplot as plt # alias consacré par l'usage
from math import sqrt, pi # importe des noms précis : on écrit sqrt(2)
La première forme est la plus sûre : le préfixe math. dit d'où vient chaque fonction et évite les collisions de noms. La troisième s'autorise pour quelques noms très fréquents ; on s'interdit en revanche from math import *, qui déverse des dizaines de noms inconnus dans le programme.
math
import math
math.sqrt(2) # 1.4142135623730951
math.pi # 3.141592653589793
math.floor(3.7) # 3 (partie entière inférieure)
math.log(8, 2) # 3.0 (logarithme en base 2)
random
import random
random.random() # flottant uniforme dans [0, 1[
random.randint(1, 6) # entier uniforme entre 1 et 6 INCLUS (un dé)
random.choice(t) # un élément de la liste t, au hasard
random.seed(42) # fige la graine : exécutions reproductibles
L'appel random.seed(42) mérite le détour : il rend le « hasard » reproductible, ce qui est indispensable pour déboguer (revoir exactement la même exécution) et pour tester (jeux de tests déterministes sur des fonctions aléatoires — chapitre 1).
Méthode : Travailler avec une boîte noire
Face à une fonction de module inconnue, trois réflexes :
help(math.floor)ou la documentation en ligne : lire la spécification (que renvoie-t-elle ? quelles préconditions ?) ;- l'essai en console : deux ou trois appels sur des cas simples dont on connaît la réponse —
math.floor(-3.5)vaut-il ou ? (Réponse : — l'essai vaut mieux que l'intuition.) - ne jamais deviner : une fonction de module a un contrat, comme les nôtres au chapitre 1 ; l'utiliser sans le connaître, c'est programmer à l'aveugle.
4.3 Lire un fichier de données
4.3.1 Ouvrir, lire, fermer
Un fichier texte se lit ligne à ligne. La forme recommandée, qui garantit la fermeture du fichier même en cas d'erreur :
with open("mesures.txt", "r") as f:
for ligne in f:
... # ligne est une chaîne, AVEC son '\n' final
Chaque ligne contient le caractère de fin de ligne '\n' : le premier geste est presque toujours ligne.strip(), qui retire les blancs et sauts de ligne aux deux extrémités.
Exercices du chapitre
- Le fichier qui ment corrigé
- La variance en un seul passage corrigé
- Construire l'histogramme soi-même corrigé
- Moyennes par catégorie corrigé
- La méthode de Monte-Carlo corrigé
- Lire un fichier à colonnes variables corrigé