Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Tue 27 May 2014 10:27

Loutre
Participant actif
Lieu: Montpellier
Date d'inscription: 12 Jan 2008
Messages: 146

Aide Programmation Python

Bonjour à tous,

J'ai commencé l'apprentissage du Python il y a quelques semaines. Je ne suis donc pas expert. Cependant, je suis en train d'écrire un petit script python permettant de travailler à partir d'une GDB pour récupérer des données.

Pour avoir un minimum de "portabilité", sachant que dans mon service nous sommes trois personnes, j'aimerai que mes collègues puissent renseigner une variable sans l'inscrire directement dans le code.

Je travail sur des bases de données cadastrales par commune. Du coup, dans mon code, j'ai une variable

Code:

commune = "Toulouse"

à titre d'exemple. Seulement voilà, pour que l'on puisse utiliser le script sans rentrer dans le code et sans changer le nom de la ville à chaque utilisation j'ai essayé de faire :

Code:

#Renseigner la commune

commune = input ("Saisissez le nom de la commune sans espaces ni accents !")
while commune != [a-z] or commune != [A-Z]:
    try: #On doit vérifier que l'utilisateur saisisse bien une chaîne de caractères (nom de commune)
        commune = str (commune) #Conversion de la variable 'commune' en chaîne de caractères
    except ValueError: #On ajoute une exception pour être certain que l'utilisateur entre un nombre malgré tout gràce au bloc TRY + EXCEPT
        print("Vous n'avez pas saisie le nom de la commune avec des lettres")
        commune = str() #On renvoit à la variable de départ si l'utilisateur n'a pas bien saisi le nom de la commune
        continue #On repart directement à la bouche WHILE sans exécuter les autres lignes
    if commune == [a-z] or commune == [A-Z]:
        print("Vous avez correctement saisi le nom de la commune suivante :", commune)

Bon le truc, c'est que j'ai un message d'erreur me disant que le nom de la commune que je rentre grâce à la fonction "input" n'est pas défini. Il y a donc quelque chose que je ne fais pas correctement.

Le but est juste d'entrer un nom de commune aléatoire, par l'utilisateur pour définir la variable "commune" et de vérifier que l'utilisateur a bien indiqué un nom avec seulement des lettres.

Si quelqu'un peut m'aider a mettre de l'ordre dans mon code wink

Merci

Hors ligne

 

#2 Tue 27 May 2014 11:23

Loutre
Participant actif
Lieu: Montpellier
Date d'inscription: 12 Jan 2008
Messages: 146

Re: Aide Programmation Python

Je viens de me rendre compte que la fonction "input" récupére que des "int" et dans mon cas ma chaîne est une "string". Du coup, il faut que j'utilise raw_input !

Hors ligne

 

#3 Tue 27 May 2014 11:31

dominique.lys
Participant assidu
Date d'inscription: 5 Oct 2006
Messages: 473
Site web

Re: Aide Programmation Python

Salut,

Premièrement il vaut mieux utiliser la fonction raw_input() pour les saisies utilisateur car pour saisir une chaine avec input() il faut que l'utilisateur ajoute des guillemets. En revanche raw_input() ne nécessite pas de guillemet en renvoi forcement une chaine donc un type str().

Du coup le code commune = str(commune) n'a pas d’intérêt puisque la variable commune est déjà une chaine et quand bien même ce serait un nombre la fonction str() n'échouera pas, au contraire elle fera ce qu'on lui demande c'est à dire convertir un nombre en texte.

La syntaxe [a-z] ça n'est pas du Python c'est une expression régulière, mais il existe un module python nommé re (pour regular expression) qui permet de les utiliser. Je te conseil cette page assez synthétique pour comprendre les expressions régulières :
http://www.dsimb.inserm.fr/~fuchs/pytho … ode14.html

Pour tester si une chaine ne contient pas de chiffre on peut par exemple utiliser l'expression régulière suivante :

Code:

^([A-Z]|[a-z])+$

Pour l'ensemble du code on peut partir sur quelque chose de beaucoup plus simple dans ce gout là:

Code:

import re

commune=""
regex="^([A-Z]|[a-z])+$"
while not re.match(regex, commune):
    commune = raw_input("Saisissez le nom de la commune sans espaces ni accents !")

Hors ligne

 

#4 Tue 27 May 2014 11:34

Loutre
Participant actif
Lieu: Montpellier
Date d'inscription: 12 Jan 2008
Messages: 146

Re: Aide Programmation Python

Merci pour beaucoup pour cette réponse et surtout pour le lien des expressions régulières !

Hors ligne

 

#5 Tue 27 May 2014 11:59

Loutre
Participant actif
Lieu: Montpellier
Date d'inscription: 12 Jan 2008
Messages: 146

Re: Aide Programmation Python

Code:

commune = "" #Notre variable commune
regex = "^([A-Z]|[a-z])+$" #Expression régulière permettant de s'assurer de la saisie en lettres
while not re.match (regex, commune):
    commune = raw_input ("Saisissez le nom de la commune sans espaces ni accents !")
    if commune == "^([A-Z]|[a-z])+$":
        print ("Vous avez correctement saisi le nom de la commune suivante :", commune)
    else:
        print ("Vous n'avez pas saisie le nom de la commune avec des lettres")

Du coup, mon code donne ça, mais avec la boucle "while", je n'arrive pas a faire afficher le "print"  de mon "if" dans le cas où j'ai bien écrit une ville en lettre.

Hors ligne

 

#6 Tue 27 May 2014 13:17

Marcos
Juste Inscrit !
Date d'inscription: 27 May 2014
Messages: 6

Re: Aide Programmation Python

Pour savoir si la variable "commune" est bien un mot sans espaces ni accents : il faut faire "re.match (regex, commune)" et non "commune == "^([A-Z]|[a-z])+$"

Le if / else ne sert à rien car l'algorithme ne sort du while que quand la variable commune contient bien un mot sans espaces ni accents

Code:

commune = "" #Notre variable commune
regex = "^([A-Z]|[a-z])+$" #Expression régulière permettant de s'assurer de la saisie en lettres
while not re.match (regex, commune):
    commune = raw_input ("Saisissez le nom de la commune sans espaces ni accents !")
print commune

Hors ligne

 

#7 Tue 27 May 2014 13:25

Benoit B
Juste Inscrit !
Date d'inscription: 7 Jul 2006
Messages: 2

Re: Aide Programmation Python

Bonjour,

la suggestion de Marcos est nickel, mais si vous tenez aux messages, quelque chose comme ça fera l'affaire :

Code:

commune = "" #Notre variable commune
regex = "^([A-Z]|[a-z])+$" #Expression régulière permettant de s'assurer de la saisie en lettres
while True:
    commune = raw_input ("Saisissez le nom de la commune sans espaces ni accents !")
    if re.match (regex, commune):
        print ("Vous avez correctement saisi le nom de la commune suivante :", commune)
        break
    else:
        print ("Vous n'avez pas saisi le nom de la commune avec des lettres")

Hors ligne

 

#8 Tue 27 May 2014 13:36

Loutre
Participant actif
Lieu: Montpellier
Date d'inscription: 12 Jan 2008
Messages: 146

Re: Aide Programmation Python

Merci pour votre aide.

Je tiens absolument a faire afficher les messages pour la simple et bonne raison que je ne serais pas seul à utiliser le script. Les autres utilisateurs n'ont pas de compétences sur ce type de langage, donc il faut que ce soit assez explicite.

Bonne journée,

Hors ligne

 

#9 Tue 27 May 2014 14:25

grdfred
Participant actif
Lieu: nantes
Date d'inscription: 17 Jul 2007
Messages: 56

Re: Aide Programmation Python

Bonjour,

Si ton outil a vocation a être intégré dans une toolbox, utilise directement le paramétrage de la boite de dialogue
commune = arcpy.GetParameterAsText(0)  # correpond au 1er parametre

Frédéric

Hors ligne

 

Pied de page des forums

Powered by FluxBB