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 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

Franck B
Membre
Lieu: PACA
Date d'inscription: 6 Sep 2005
Messages: 1382
Site web

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)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#4 Mon 11 April 2016 16:19

Franck B
Membre
Lieu: PACA
Date d'inscription: 6 Sep 2005
Messages: 1382
Site web

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)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#6 Tue 12 April 2016 11:57

Franck B
Membre
Lieu: PACA
Date d'inscription: 6 Sep 2005
Messages: 1382
Site web

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

 

Pied de page des forums

Powered by FluxBB