• Aucun résultat trouvé

Nous allons écrire le programme ensemble au fur et à mesure. Alors tout d'abord, je commence par un petit en-tête pour indiquer l'encodage de mon fichier mais aussi les quelques commentaires habituels tels que l'auteur du script et sa date de création :

Code : Python

# -*- coding: latin-1 -*- ########################## # Création d'une syntaxe # # --- # # Auteur : Suzy #

# Crée le : 02/07/2010 # ##########################

Ensuite, l'utilisateur devra me donner un nom de fichier et j'espère bien que celui-ci existe. Il existe une fonction dans le module os de Python qui permet de vérifier l'existence d'un dossier ou d'un fichier. Je vais donc importer le module os.

Code : Python

# Utile pour vérifier l'existence d'un fichier :

import os

J'affiche ensuite une petite interface simple juste pour marquer le début de mon programme de façon claire dans la console :

Code : Python

# Petite interface textuelle :

print("*******************************\n" + "* Exemple de syntaxe simple : *\n" + "*******************************")

Afin de facilité la recherche des fichiers créés, nous allons demander un nom de projet à l'utilisateur :

Code : Python

# Demander le nom du projet :

nomProjet = input("Donnez un nom à votre projet : ")

Je veux maintenant récupérer le nom du fichier d'entrée que je devrais utiliser en vérifiant que celui-ci existe bien.

Code : Python

# Demander le nom du fichier à utiliser :

nomFichier = input("Quel fichier voulez-vous utiliser ? ")

while not os.path.exists(nomFichier) : print("Ce fichier n'existe pas !")

nomFichier = input("Quel fichier voulez-vous utiliser ? ")

La condition de la boucle while est assez explicite si vous parlez un peu anglais. Elle dit "Tant que le chemin nomFichier n'existe pas fait :". Ceci est un excellent exemple de la simplicité du langage Python ! Le code est parfaitement lisible et compréhensible par n'importe qui !

La fonction exists du module os.path retourne True si le fichier/chemin existe et False sinon.

Maintenant que nous avons un nom de fichier correct, nous allons l'ouvrir et le lire ! Nous savons que seules trois lignes nous seront utiles. Nous allons donc compter les lignes afin d'identifier sur quelle ligne nous travaillons.

Code : Python

# Ouvrir le fichier :

fichier = open(nomFichier,"r") numeroLigne = 1

# Lire le fichier :

for ligne in fichier : instructions...

Ici, on n'ouvre le fichier qu'en lecture car on ne veut pas le modifier. Maintenant va commencer l'analyse syntaxique. C'est-à-dire que nous allons traiter chacune des lignes du fichier pour en retirer les informations qui nous intéressent. Pour cela, on

commence par nettoyer en jetant ce qui ne nous intéresse pas :

Code : Python

# Lire le fichier :

for ligne in fichier :

# On retire le caractère de fin de ligne : ligne = ligne.replace("\n","")

#On retire les commentaires de la lignes : ligne = ligne.split("#")[0]

# On ne considère pas les lignes vides : if ligne != "" :

instructions...

Le caractère de fin de ligne ne nous intéresse jamais, il vaut mieux le retirer tout de suite. Ensuite, les commentaires ne nous intéressent pas non plus. On retire donc tout ce qui se trouve après le caractère '#'. Enfin, si la ligne est vide après ces traitements, c'est qu'elle ne contient rien d'intéressant, sinon, c'est que c'est une des lignes qui nous intéressent. Une fois que l'on a potentiellement quelque chose qui nous intéresse, on va lire la ligne et surtout lire la syntaxe que nous avons créée :

Code : Python

# On ne considère pas les lignes vides : if ligne != "" :

if numeroLigne == 1 :

# On retire tous les espaces : ligne = ligne.replace(' ','') # On sépare les opérations : operations = ligne.split(',') print(operations)

elif numeroLigne == 2 :

# On sépare les nombres :

premiersNombres = ligne.split(' ') # On retire tous les espaces de trop : while '' in premiersNombres :

premiersNombres.remove('') print(premiersNombres)

elif numeroLigne == 3 :

# On retire les crochets et les espaces et on sépare les nombres :

deuxiemesNombres = ligne.replace(' ','').replace("[","").replace("]","").split(',') print(deuxiemesNombres)

numeroLigne += 1

Dans l'exemple que je donne, une mauvaise écriture du fichier d'entrée entraînera des erreurs ! Nous ne gèrerons pas ici les erreurs de syntaxe dans le fichier d'entrée, mais vous serez parfaitement capable de le faire après le chapitre

consacré aux exceptions.

Vous remarquerez ici que l'on peut utiliser les fonctions sur les chaînes de caractères soit séparément soit en les chaînant. En effet, le résultat de chacune de ces fonctions étant aussi une chaîne de caractères, on peut leur appliquer directement des fonctions ! Ce qui fait que dans l'analyse de la troisième ligne, le traitement ne tient qu'en une seule ligne !

Les print ne sont ici que pour vous écrire ce qui sort exactement de cette première partie du programme. Cela vous permet de vérifier notamment que l'analyse syntaxique est bonne !

Maintenant que l'on a récupéré les données qui nous intéressent dans notre fichier, il faut bien penser à le fermer :

Code : Python

#Fermer le fichier : fichier.close()

Notre fichier d'entrée ne nous intéresse maintenant plus et nous allons nous attaquer à l'écriture des fichiers de sorties. On veut donc un fichier différent pour chacune des opérations et chacune des valeurs de la première liste. Ensuite, il faudra remplir les fichiers avec l'ensemble des opérations. On va donc avoir la chose suivante :

Code : Python

# Pour chaque opération :

for operation in operations :

# Associer un nom à chaque opération et ne pas faire la suite # si l'opération n'existe pas :

if operation == '+' : nomOperation = 'addition' elif operation == '-' : nomOperation = 'soustraction' elif operation == '*' : nomOperation = 'multiplication' elif operation == '/' : nomOperation = 'division' elif operation == '%' : nomOperation = 'modulo' elif operation == '**' : nomOperation = 'puissance' elif operation == '//' : nomOperation = 'divisionEntiere' else :

print("L'opération %s n'est pas reconnue !" % (operation)) continue

Ceci va permettre de ne considérer que les opérations qui existent effectivement ! L'utilisateur sera donc libre de taper n'importe quoi pour les opérations, il verra bien si cela ne fonctionne pas ! J'utilise ici pour la première fois l'outil de formatage des chaînes de caractères à la ligne :

Code : Python

print("L'opération %s n'est pas reconnue !" % (operation))

L'opérateur % permet de remplacer les éléments marqués par % par ceux données entre parenthèses par la suite. Le formatage des chaînes se fait via différents indicateurs, les principaux étant :

% s : conversion en chaîne via str() avant formatage. % i : nombre entier (integer).

% e / % E : notation exponentielle (scientifique) d'un nombre. % f / % F : nombre réel (à virgule flottante).

% % : le caractère % en lui-même !

De cette façon, il est possible de formater facilement une chaîne de caractère en y insérant les valeurs de variables par exemple. C'est ce nous ferons dans la suite pour nommer correctement les fichiers que nous allons créer. Créons donc nos fichiers :

Code : Python

# Pour chacune des valeurs :

for valeur in premiersNombres : # Création du fichier :

fichier = open('%s-%s-%s.txt' % (nomProjet,nomOperation,valeur), 'w')

On va maintenant écrire les résultats de nos opérations dans les fichiers. Bien entendu, il faut faire attention à considérer les opérations impossibles à réaliser telles que la division ou le modulo par 0. On obtient alors :

Code : Python

# Ecrire dans le fichier : for nombre in

range(eval(deuxiemesNombres[0]),eval(deuxiemesNombres[1]),eval(deuxiemesNombres[2])) :

if (operation == '/' or operation == '//' or operation == '%') and

nombre == 0 :

fichier.write("%s %s %s = impossible !\n" % (valeur.center(10), operation, str(nombre).center(10)))

else :

fichier.write("%s %s %s = %f\n" % (valeur.center(10), operation,

str(nombre).center(10), \

eval(valeur+operation+str(nombre))))

Pour la première fois ici, j'écris une instruction Python sur plusieurs lignes. Pour cela, j'utilise le caractère '\' qui indique que l'instruction se poursuit à la ligne suivante. Du moment que vous utilisez ce caractère à chacune de vos lignes, il est possible d'écrire une instruction sur autant de lignes que vous le désirez.

Remarquez ici que j'utilise la spécificité de la fonction eval qui peut évaluer le résultat d'opérations écrites dans une chaîne de caractères ! J'évite ainsi plusieurs conversions inutiles de mes variables. Ensuite, j'utilise la fonction center pour aligner correctement mes résultats et obtenir des fichiers un peu plus lisibles. Enfin, il ne faut pas oublier de fermer le fichier que l'on vient d'ouvrir à chaque pas de boucle afin de s'assurer que celui-ci se sauvegarde bien.

Code : Python

# Fermer le fichier :

fichier.close()

En Python, vous ne pouvez pas ouvrir plus de 50 fichiers simultanément ! N'oubliez donc jamais de fermer les fichiers que vous ouvrez, surtout si vous en ouvrez dans une boucle comme c'est le cas ici ! Si vous ne le faites pas, votre programme a de fortes chances de planter !

Voilà, maintenant notre programme est terminé ! Je vous donne quand même la version complète pour que vous puissiez vous assurez de l'exécuter correctement ! Vous devriez obtenir tout un tas de fichiers textes très moches mais qui correspondent bien à ce que vous vouliez ! Vous avez donc réussi à analyser des lignes de texte et à en exploiter les données pour créer d'autres fichiers selon un format que vous avez créé !

Code : Python - v3

# -*- coding: latin-1 -*- ########################## # Création d'une syntaxe # # --- # # Auteur : Suzy #

# Crée le : 02/07/2010 # ##########################

# Utile pour vérifier l'existence d'un fichier :

import os

# Petite interface textuelle :

print("*******************************\n" + "* Exemple de syntaxe simple : *\n" + "*******************************") # Demander le nom du projet :

nomProjet = input("Donnez un nom à votre projet : ") # Demander le nom du fichier à utiliser :

nomFichier = input("Quel fichier voulez-vous utiliser ? ")

while not os.path.exists(nomFichier) : print("Ce fichier n'existe pas !")

nomFichier = input("Quel fichier voulez-vous utiliser ? ") # Ouvrir le fichier :

fichier = open(nomFichier,"r") numeroLigne = 1

# Lire le fichier :

for ligne in fichier :

# On retire le caractère de fin de ligne : ligne = ligne.replace("\n","")

#On retire les commentaires de la lignes : ligne = ligne.split("#")[0]

# On ne considère pas les lignes vides : if ligne != "" :

if numeroLigne == 1 :

# On retire tous les espaces : ligne = ligne.replace(' ','') # On sépare les opérations : operations = ligne.split(',') elif numeroLigne == 2 :

# On sépare les nombres :

premiersNombres = ligne.split(' ') # On retire tous les espaces de trop : while '' in premiersNombres :

premiersNombres.remove('') elif numeroLigne == 3 :

# On retire les crochets et les espaces et on sépare les nombres : deuxiemesNombres = ligne.replace('

','').replace("[","").replace("]","").split(',') numeroLigne += 1

#Fermer le fichier : fichier.close()

# Pour chaque opération :

for operation in operations :

# Associer un nom à chaque opération et ne pas faire la suite # si l'opération n'existe pas :

if operation == '+' : nomOperation = 'addition' elif operation == '-' : nomOperation = 'soustraction' elif operation == '*' : nomOperation = 'multiplication' elif operation == '/' : nomOperation = 'division' elif operation == '%' : nomOperation = 'modulo' elif operation == '**' : nomOperation = 'puissance' elif operation == '//' : nomOperation = 'divisionEntiere' else :

print("L'opération %s n'est pas reconnue : les fichiers ne seront pas générés !" % (operation))

continue

print("Génération des fichiers pour l'opération %s." % (operation)) # Pour chacune des valeurs :

for valeur in premiersNombres : # Création du fichier :

fichier = open('%s-%s-%s.txt' % (nomProjet,nomOperation,valeur), 'w') # Ecrire dans le fichier :

for nombre in

range(eval(deuxiemesNombres[0]),eval(deuxiemesNombres[1]),eval(deuxiemesNombres[2 :

if (operation == '/' or operation == '//' or operation == '%') and

nombre == 0 :

fichier.write("%s %s %s = impossible !\n" % (valeur.center(10), operation, str(nombre).center(10)))

else :

fichier.write("%s %s %s = %f\n" % (valeur.center(10), operation,

str(nombre).center(10), \

eval(valeur+operation+str(nombre)))) # Fermer le fichier :

fichier.close()

Dans cette version, j'ai modifié légèrement l'affichage pour indiquer quelle opération est en cours de traitement.

Pour ceux qui travailleraient en Python v2.7, la seuls différence est encore une fois dans la fonction print qui ne nécessite pas de parenthèses et la fonction input qui doit être remplacée par la fonction raw_input.

Un bon entraînement serait de faire un programme qui fait exactement l'inverse ! En étudiant un ensemble de fichiers remplis de calculs, il pourrait générer un fichier d'entrée pour notre programme ci-dessus ! Enfin, si vous vous sentez le courage de le faire, le principe est le même !

Bien, vous maîtrisez maintenant un peu mieux les chaînes de caractères. N'hésitez surtout pas à vous exercer. Je suis sûr que vous trouverez de vous-mêmes des idées pour vous entraîner ! Si vous vous sentez prêt à continuer, nous allons étudier les listes dans le prochain chapitre.

Documents relatifs