Cours Python avec exercices écrit par Christophe Darmangeat dans le cadre du M2 PiSE |
|
Les fichiersOuverture et fermetureL'ouverture s'effectue via la fonction open(), qui retourne le fichier sous forme d'objet. L'originalité de Python est de proposer de nombreux modes d'ouverture, en plus des trois classiques :
Pour utiliser un fichier en mode binaire, on rajoute 'b' aux codes précédents (par exemple, 'rb' pour lire un fichier binaire). La fermeture s'effectue via la méthode close(). L'ensemble donne donc une syntaxe standard :
monFichier = open('chemin/fichier.txt', mode) Lecture(s) d'un fichierLa lecture d'un fichier peut se faire ligne par ligne ou d'un seul coup, au choix du programmeur. Pour une lecture ligne à ligne, on emploie la méthode readline(), ce qui donnera quelque chose du genre :
fichier = open('donnees.txt', 'r') Ici, on s'est contenté d'afficher le contenu du fichier à l'écran. Mais pour traiter les informations qu'il contient, on peut souhaiter ranger les lignes dans une liste. Ceci peut se faire via une instruction append à l'intérieur de la boucle. Mais comme (presque) toujours en Python, il existe une instruction qui fait cela toute seule, en l'occurence readlines – au pluriel, donc. Démonstration :
fichier = open('donnees.txt', 'r') À l'issue de ce code, les lignes du fichier seront stockées sous forme de liste dans lignes. Une autre approche (notamment lorsque le fichier n'est pas spécialement structuré en lignes) consiste à le lire d'un seul coup, le rangeant ainsi dans une variable dont on se dépatouillera plus tard, via l'instruction read :
fichier = open('donnees.txt', 'r') Écriture(s) d'un fichierFaut-il le rappeler, pour écrire dans un fichier, il faut avoir pris soin de l'ouvrir dans un des modes permettant cette opération (w, a ou r+). Pour un fichier texte, l'écriture d'une ligne constituée d'une chaîne de caractère se fait par la méthode write. Attention, l'ajout du saut de ligne final n'est pas réalisée automatiquement. La chaîne écrite doit donc se terminer par la séquence \n :
fichier = open('resultats.txt', 'w') Tout comme on pouvait lire d'un seul coup un fichier texte en récupérant les lignes dans une liste avec Readlines(), on peut en sens inverse écrire d'un seul coup une liste dans un fichier sous forme de lignes, avec la méthode Writelines() :
lignes = ['Ligne 1\n', 'Ligne 2\n', 'Ligne 3\n'] Techniques supplémentairesPrévenir les erreursUn des problèmes qui se posent lorsqu'on veut utiliser un fichier en lecture dans un programme est sa possible absence de l'emplacement programmé. Aussi est-il est sage d'ouvrir le parapluie et de prévenir qu'une telle erreur interrompe l'exécution du programme. Python propose pour cela un bloc try, qui permet en quelque sorte d'attraper une erreur au vol avant qu'elle n'interrompe l'exécution, et de la gérer via l'instruction except. On pourra ainsi écrire quelque chose du genre :
try: Économiser l'instruction closeBien des programmeurs aiment économiser l'instruction Close() en ouvrant le fichier via l'instruction With. Ainsi, au lieu d'écrire comme précédemment :
monFichier = open('chemin/fichier.txt', mode) On aura à présent :
with open('chemin/fichier.txt', mode) as monFichier: Travailler avec des fichiers CSVLorsque le fichier est de type texte, où le caractère de délimitation est a priori la virgule, Python propose comme toujours des instructions afin de nous mâcher le travail. La lecture d’un tel fichier, en particulier, peut nous permettre de récupérer non seulement la structure des enregistrements (des lignes), mais aussi celle des champs. Imaginons que nous traitions un fichier d'employés comportant trois champs (nom, service, date de naissance) séparés par des virgules. On pourra afficher le contenu du fichier par le code suivant :
import csv csv_lecture est ici un objet d'un type particulier. On peut s'en servir directement, en écrivant par exemple une boucle telle que :
for row in csv_lecture: On peut également convertir cet objet en liste, afin de revenir en territoire connu : listeFichier = list(csv_lecture) Plus fort encore, on peut recopier (« parser ») directement le contenu d'un fichier csv dans un dictionnaire. Il suffit pour cela que la première ligne du fichier contienne bien les noms de champ, qui seront utilisés par python comme les noms des clés du dictionnaire. Démonstration :
import csv La question de l'écriture se pose exactement dans les mêmes termes, mais en quelque sorte à l'envers. Si chaque ligne à écrire est consitituée à partir d'une liste, on pourra avoir un code du genre :
import csv A noter que le quoting, c'est-à-dire l'insertion forcée de guillemets autour de chaque donnée, est montré ici, mais n'a rien d'une obligation. On peut tout à fait omettre les arguments le concernant dans la méthode csv_writer Quant à écrire un fichier csv à partir d'un dictionnaire, on peut s'inspirer de l'exemple suivant :
import csv Nous en savons à présent suffisamment pour nous lancer dans une petite application. Ex 1 : Meilleurs scores On joue au jeu le plus idiot de la terre : il consiste à lancer 10 dés et à additionner les points obtenus. Toutefois, on tient le compte des dix meilleurs scores jamais réalisés. À chaque partie, la machine devra donc vérifier si le score réalisé par le joueur entre dans le Top 10. Dans ce cas, elle lui demandera son nom, puis affichera un message tel que : « Félicitations ! Vous intégrez le Hall of Fame. » La machine affiche ensuite les dix meilleurs scores (par ordre décroissant), avec pour chaque d'eux le nom et le score. NB : Le fichier des meilleurs scores devra impérativement être codé en csv. Et comme les petits obstacles techniques à franchir ne manquent pas, n'hésitez pas à recourir à Google pour débloquer les situations ! |