#1 Fri 08 April 2016 09:55
- LE HIR
- Participant occasionnel
- Date d'inscription: 27 Oct 2013
- Messages: 21
Syntaxe Code python
Bonjour,
Je cherche à mettre en place un script me permettant de remplacer un mot d'une adresse par son abréviation.
Exemple : Commandant deviendrait Cdt
Je tente de faire fonctionner l'un des 2 scripts ci-dessous mais je n'y arrive pas
1er Script :
Code:
complet = ["Amiral", "Capitaine", "Docteur", "Maréchal", ] abrev = ["Am.", "Cap.", "Doc.", "Mal."] def abreviation(nomvoi): s = "" for c in nomvoi: i = complet.find(c) if i>=0: s += abrev[i] else: s += c return s __esri_field_calculator_splitter__ abreviation( !NOMVOI!)
2ème script
Code:
complet = ["Amiral", "Capitaine", "Docteur", "Maréchal"] abrev = ["Am.", "Cap.", "Doc.", "Mal."] def abreviation (nomvoi): for i in xrange(len(complet)): nomvoi = nomvoi.replace(complet[i], abrev[i]) return __esri_field_calculator_splitter__ abreviation( !NOMVOI!)
Merci d'avance de l'aide que vous pourrez m'apporter.
Hors ligne
#2 Fri 08 April 2016 14:03
Re: Syntaxe Code python
Bonjour,
Le script 1 : il est étrange... les listes n'ont pas de méthode find...
Le script 2 : il manque le retour
Code:
return nomvoi
.
A+
Franck
Exemple de fonctions possibles :
Code:
#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function from __future__ import unicode_literals ABREVIATION = {'Amiral': 'Am.', 'Capitaine': 'Cap.', 'Docteur': 'Doc.', 'Maréchal' : 'Mal.'} COMPLET = ["Amiral", "Capitaine", "Docteur", "Maréchal"] ABREV = ["Am.", "Cap.", "Doc.", "Mal."] def abreviation(nomvoi): for mot, abreva in ABREVIATION.iteritems(): nomvoi = nomvoi.replace(mot, abreva) return nomvoi def abreviation2(nomvoi): for i in zip(COMPLET, ABREV): nomvoi = nomvoi.replace(*i) return nomvoi def abreviation3(nomvoi): for i in xrange(len(COMPLET)): nomvoi = nomvoi.replace(COMPLET[i], ABREV[i]) return nomvoi def main(): nomvoies = ["Rue de l'Amiral Mouchez", 'Avenue du Capitaine Cook', 'Place du Maréchal Juin', 'Impasse du Docteur No'] print('dictionnaire') for nomvoie in nomvoies: nomvoieabrev = abreviation(nomvoie) print(nomvoie, '\t\t:', nomvoieabrev) print('zip et mecanisme de unpack') for nomvoie in nomvoies: nomvoieabrev = abreviation2(nomvoie) print(nomvoie, '\t\t:', nomvoieabrev) print('xrange') for nomvoie in nomvoies: nomvoieabrev = abreviation3(nomvoie) print(nomvoie, '\t\t:', nomvoieabrev) if __name__ == '__main__': main()
Hors ligne
#3 Mon 11 April 2016 15:29
- LE HIR
- Participant occasionnel
- Date d'inscription: 27 Oct 2013
- Messages: 21
Re: Syntaxe Code python
Bonjour,
Tout d'abord merci Franck pour la réponse.
Bon je ne suis pas très douée en phyton...
J'ai tenté d'utiliser le code fourni pour l'intégrer dans mon model builder.
J'ai opté pour la 3ème proposition
Si je le teste dans IDLE pas d'erreur,
Par contre, sous Arcmap avec le calculateur de champ j'obtiens l'erreur suivante (voir pièce jointe) :
Erreur linge 13 et 17
c'est à dire :
for nomvoie in nomvoies:
main()
La syntaxe que j'utilise est la suivante :
Code:
ABREVIATION = {'Amiral': 'Am.', 'Capitaine': 'Cap.', 'Docteur': 'Doc.', 'Maréchal' : 'Mal.'} COMPLET = ["Amiral", "Capitaine", "Docteur", "Maréchal"] ABREV = ["Am.", "Cap.", "Doc.", "Mal."] def abreviation3(mot): for i in xrange(len(COMPLET)): mot = mot.replace(COMPLET[i], ABREV[i]) return mot def main(): for nomvoie in nomvoies: nomvoieabrev = abreviation3(nomvoie) if __name__ == '__main__': main() __esri_field_calculator_splitter__ nomvoie(!NOMVOI!)
Merci d'avance pour l'aide qui pourra m'être apportée.
Dernière modification par LE HIR (Mon 11 April 2016 15:31)
Hors ligne
#4 Mon 11 April 2016 16:19
Re: Syntaxe Code python
Bonjour,
Lors du passage d'IDLLE (très pratique pour tester sa fonction de mon point de vue) à la calculatrice ArccGIS, il ne faut garder que la fonction et les éventuelles constantes :
Code:
COMPLET = [u"Amiral", u"Capitaine", u"Docteur", u"Maréchal"] ABREV = [u"Am.", u"Cap.", u"Doc.", u"Mal."] def abreviation3(mot): for i in xrange(len(COMPLET)): mot = mot.replace(COMPLET[i], ABREV[i]) return mot __esri_field_calculator_splitter__ abreviation3(!NOMVOI!)
A+
Franck
PS:
L'analyseur de syntaxe Python d'ArcGIS, indique qu'il ne connait pas la variable nomvoies (qui est dans la fonction main()) et effectivement, cette variable n'est pas définie...
Hors ligne
#5 Tue 12 April 2016 10:09
- LE HIR
- Participant occasionnel
- Date d'inscription: 27 Oct 2013
- Messages: 21
Re: Syntaxe Code python
Code proposé et testé via IDLE
Code:
COMPLET = ["Amiral", "Capitaine", "Docteur", "Maréchal"] ABREV = ["Am.", "Cap.", "Doc.", "Mal."] def abreviation3(nomvoi): for i in xrange(len(COMPLET)): nomvoi = nomvoi.replace(COMPLET[i], ABREV[i]) return nomvoi def main(): nomvoies = ["Rue de l'Amiral Mouchez", 'Avenue du Capitaine Cook', 'Place du Maréchal Juin', 'Impasse du Docteur No'] print('xrange') for nomvoie in nomvoies: nomvoieabrev = abreviation3(nomvoie) print(nomvoie, '\t\t:', nomvoieabrev) if __name__ == '__main__': main()
Syntaxe testée dans Arcgis (je joins le message d'erreur obtenu)
Code:
COMPLET = ["Amiral", "Capitaine", "Docteur", "Maréchal"] ABREV = ["Am.", "Cap.", "Doc.", "Mal."] #permet le remplacement du mot complet par son abreviation ex Capitaine devient Cap. def abreviation3(mot): for i in xrange(len(COMPLET)): mot = mot.replace(COMPLET[i], ABREV[i]) return mot #permet le remplacement du nom de la rue complète par le nom de la rue avec abreviation ex: Rue de l'Amiral Mouchez, devient Rue de l'Am. Mouchez) #Il faut que je remplace : #nomvoies = ["Rue de l'Amiral Mouchez", 'Avenue du Capitaine Cook', 'Place du Maréchal Juin', 'Impasse du Docteur No'] par la valeur de mon champ, soit nomvoies(!NMVOI!) #remplacement de def main(): par def nomvoies(): def nomvoies(nomvoie): for nomvoie in nomvoies: nomvoieabrev = abreviation3(nomvoie) return nomvoieabrev #suppresion de if #if __name__ == '__main__': # main() __esri_field_calculator_splitter__ nomvoies(!NMVOI!)
Merci d'avance pour l'aide qui me sera apportée
Dernière modification par LE HIR (Tue 12 April 2016 10:10)
Hors ligne
#6 Tue 12 April 2016 11:57
Re: Syntaxe Code python
Bonjour,
Oups, je me suis trompé hier soir...
Code:
COMPLET = [u"Amiral", u"Capitaine", u"Docteur", u"Maréchal"] ABREV = [u"Am.", u"Cap.", u"Doc.", u"Mal."] def abreviation3(mot): for i in xrange(len(COMPLET)): mot = mot.replace(COMPLET[i], ABREV[i]) return mot __esri_field_calculator_splitter__ abreviation3(!NOMVOI!)
La fonction s'appelle "abreviation3".
A+
Franck
PS:
Il faut absolument que le champ sur lequel le calcul est lancé, n'ait pas de valeur nulle ou modifier la fonction ainsi :
Code:
COMPLET = [u"Amiral", u"Capitaine", u"Docteur", u"Maréchal"] ABREV = [u"Am.", u"Cap.", u"Doc.", u"Mal."] def abreviation3(mot): if mot is None: return mot for i in xrange(len(COMPLET)): mot= mot.replace(COMPLET[i], ABREV[i]) return mot
PPS : j'ai corrigé les deux messages...
Hors ligne
#7 Tue 12 April 2016 17:16
- lebon henri
- Participant actif
- Lieu: Vendée
- Date d'inscription: 14 Jan 2008
- Messages: 99
Re: Syntaxe Code python
Bonjour, avec un dictionnaire c'est plus facile. Il vaut aussi mieux mettre une clause "else" pour les cas non répertoriés à l'avance.
Bonne journée.
Code:
abregDico = {u"Amiral" : u"Am.", u"Capitaine" : u"Cap.", u"Docteur" : u"Doc.", u"Maréchal" : u"Mal."} def abreviation(mot): if abregDico.has_key(mot): abbreg = abregDico[mot] return abbreg else: return '' ##on retourne une chaine vide, ça permet de voir là où ça a pas marché
Hors ligne
#8 Tue 12 April 2016 17:26
- LE HIR
- Participant occasionnel
- Date d'inscription: 27 Oct 2013
- Messages: 21
Re: Syntaxe Code python
Merci pour vos réponses.
Je suis absentes 2 jours
Je test cela à mon retour.
Merci encore pour votre aide
Hors ligne
#9 Fri 15 April 2016 14:17
- LE HIR
- Participant occasionnel
- Date d'inscription: 27 Oct 2013
- Messages: 21
Re: Syntaxe Code python
Bonjour,
Me voilà de retour, donc j'ai testé les 2 solutions proposées :
Code:
COMPLET = [u"Amiral", u"Capitaine", u"Docteur", u"Maréchal"] ABREV = [u"Am.", u"Cap.", u"Doc.", u"Mal."] def abreviation3(mot): if mot is None: return mot for i in xrange(len(COMPLET)): mot= mot.replace(COMPLET[i], ABREV[i]) return mot
et
Code:
abregDico = {u"Amiral" : u"Am.", u"Capitaine" : u"Cap.", u"Docteur" : u"Doc.", u"Maréchal" : u"Mal."} def abreviation(mot): if abregDico.has_key(mot): abbreg = abregDico[mot] return abbreg else: return '' ##on retourne une chaine vide, ça permet de voir là où ça a pas marché
Seul la première fonctionne.
Pour la deuxième pas de message d'erreur mais le résultat est toujours null alors que j'ai des cas où des mots doivent être abrégés
Merci encore pour votre aide
Hors ligne