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 Thu 11 December 2014 17:32

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

Message erreur Python

Bonjour à tous,

Je suis en train d'automatiser un calcul sur un champ dans une "geodatabase" personnelle de type table avec la commande suivante :

Code:

arcpy.CalculateField_management (mdb_data_proprietaire, arcpy.ListFields (mdb_data_proprietaire, "ADRESSE")[0].name, "!ADRESSE!.replace ('lã©', ' é')" , "PYTHON_9.3")

Cependant, j'ai un message d'erreur après exécution du script dès que j'ai des caractères spéciaux. Le voici :

arcpy.CalculateField_management (mdb_data_proprietaire, arcpy.ListFields (mdb_data_proprietaire, "ADRESSE")[0].name, "!ADRESSE!.replace ('ã©', 'é')" , "PYTHON_9.3")
  File "C:\Program Files (x86)\ArcGIS\Desktop10.2\arcpy\arcpy\management.py", line 3183, in CalculateField
    raise e
arcgisscripting.ExecuteError: ERROR 000539: Error running expression: u"14 bis rue augereau".replace ('ã©', 'é')
Traceback (most recent call last):
  File "<expression>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)


Au début de mon script, j'ai déclaré l'encode avec

Code:

# -- coding: utf-8 --

Je précise que ma commande fonctionne parfaitement dès lors qu'il n'y a pas d'accent ou caractère spécial.

Aussi, quelque fois dans ma liste (mon champ ADRESSE), j'aimerai remplacer les "18 p du marché" par "18 Place du marché"

Cependant il faut absolument que je spécifie que le remplacement doit se faire exclusivement s'il y a un nombre avant la lettre. Comment puis-je automatiser ceci ?

Je continue mes tests de mon côté.

Bien cordialement

Hors ligne

 

#2 Thu 11 December 2014 22:29

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

Re: Message erreur Python

Bonjour,

J'essayerai ceux-ci :

Code:

arcpy.CalculateField_management (mdb_data_proprietaire, arcpy.ListFields (mdb_data_proprietaire, "ADRESSE")[0].name, "!ADRESSE!.replace (u'lã©', u' é')" , "PYTHON_9.3")

Pour en finir avec les problème d'encodage des chaînes en Python :
- L’encoding en Python, une bonne fois pour toute
- Charsets et encoding

A+

Franck


A+

Franck

Hors ligne

 

#3 Mon 15 December 2014 08:16

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

Re: Message erreur Python

Bonjour,

Merci pour l'astuce, ça fonctionne bien.

Code:

arcpy.CalculateField_management (mdb_data_proprietaire, arcpy.ListFields (mdb_data_proprietaire, "ADRESSE")[0].name, "!ADRESSE!.capitalize ()" , "PYTHON_9.3")

J'utilise également cette ligne pour mettre en majuscule la première lettre de ma chaîne de caractère dans le champ "ADRESSE".
Cependant j'aimerai mettre les premières lettres de chaque mots de ma phrase en majuscule sauf pour quelques mots et donc en ajoutant des exceptions.

Par exemple si j'ai "la ferme de la fontaine", j'aimerai après traitement avoir "La ferme de la Fontaine". Les mots et donc les exceptions seraient  les "de, la, du, des etc..."

Est-il possible de faire ça ?

Bien cordialement,

Hors ligne

 

#4 Mon 15 December 2014 08:40

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

Re: Message erreur Python

Bonjour,

Une question équivalente a déjà été postée cet été : Cherche expression en Python - Majuscule / Minuscule.

Une solution avait été donnée.

A+

PS : le moteur de recherche du site aurait pu servir, en tapant "python majuscule", on retrouve ce post.

Franck

Hors ligne

 

#5 Mon 15 December 2014 14:11

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

Re: Message erreur Python

Bonjour,

J'avais déjà vu ce post, car avant de poster je fais une recherche dans le forum...
Cependant, dans mon cas, je ne maîtrise pas la solution qui avait été proposée et je fonctionne avec mes lignes de code ci-dessus.

J'ai besoin d'avoir quelque chose de simple et rapide alors je ne peux pas me permettre de me plonger dans votre code pour l'adapter à ma sauce sachant que le mien fonctionne déjà, même s'il n'est pas du tout optimiser pour ce que je veux faire :

Code:

import arcpy, re


#Renseigner le type de données

nom = ""
regex = "^([A-Za-z0-9])+$"
while not re.match (regex, nom):
    nom = raw_input ("Saisissez un nom :")

#Renseigner la lettre de l'agence

lettre = ""
regex = "^([A-Za-z0-9])+$"
while not re.match (regex, lettre):
    lettre = raw_input ("Saisissez sa lettre :")

#Répertoire des données

    data = r"S:\Cartographie\w_cad"

#Chemins définitifs des données après traitement des données

    data_proprietaire = data + "\\" + nom + "_" + lettre + ".mdb"

    mdb_data_proprietaire = data_proprietaire + r"\Proprio2"
    print "SOURCE TABLE : {0}".format (mdb_data_proprietaire)

    print "SOURCE MDB : {0}".format (data_proprietaire)

    print "..:::: Chemins de production pour futur traitement des donnees OK ::::.."

#Mise en conformité de l'ensemble des données dans la table MDB "Proprio2"

    nb_proprietaire = int (arcpy.GetCount_management (mdb_data_proprietaire).getOutput (0))
    print "Nombre de proprietaire dans la table : {0}".format (nb_proprietaire)

#Quelques tests sur la base de l'Agence R Bis

    arcpy.CalculateField_management (mdb_data_proprietaire, arcpy.ListFields (mdb_data_proprietaire, "ADRESSE")[0].name, "!ADRESSE!.replace (u'ã©', u'é')" , "PYTHON_9.3")
    arcpy.CalculateField_management (mdb_data_proprietaire, arcpy.ListFields (mdb_data_proprietaire, "ADRESSE")[0].name, "!ADRESSE!.capitalize ()" , "PYTHON_9.3")

Hors ligne

 

#6 Tue 16 December 2014 18:57

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

Re: Message erreur Python

Loutre a écrit:

J'avais déjà vu ce post, car avant de poster je fais une recherche dans le forum...
Cependant, dans mon cas, je ne maîtrise pas la solution qui avait été proposée et je fonctionne avec mes lignes de code ci-dessus.


Bonjour,

Pourtant, ce code est une bonne piste pour réaliser ce que tu veux smile

Ce code devrait fonctionner :

Code:

import arcpy, re


#Renseigner le type de données

nom = ""
regex = "^([A-Za-z0-9])+$"
while not re.match (regex, nom):
    nom = raw_input ("Saisissez un nom :")

#Renseigner la lettre de l'agence

lettre = ""
regex = "^([A-Za-z0-9])+$"
while not re.match (regex, lettre):
    lettre = raw_input ("Saisissez sa lettre :")

#Répertoire des données

    data = r"S:\Cartographie\w_cad"

#Chemins définitifs des données après traitement des données

    data_proprietaire = data + "\\" + nom + "_" + lettre + ".mdb"

    mdb_data_proprietaire = data_proprietaire + r"\Proprio2"
    print "SOURCE TABLE : {0}".format (mdb_data_proprietaire)

    print "SOURCE MDB : {0}".format (data_proprietaire)

    print "..:::: Chemins de production pour futur traitement des donnees OK ::::.."

#Mise en conformité de l'ensemble des données dans la table MDB "Proprio2"

    nb_proprietaire = int (arcpy.GetCount_management (mdb_data_proprietaire).getOutput (0))
    print "Nombre de proprietaire dans la table : {0}".format (nb_proprietaire)

#Quelques tests sur la base de l'Agence R Bis

    arcpy.CalculateField_management (mdb_data_proprietaire, arcpy.ListFields (mdb_data_proprietaire, "ADRESSE")[0].name, "!ADRESSE!.replace (u'ã©', u'é')" , "PYTHON_9.3")

    expression = "Capit(!ADRESSE!)"
    codeblock = """
listeMinuscule = ["le", "la", "de", "du"]
listMajuscule = ["RN", "ZAC", "ETC"]

def Capit(chaine):
    # Separation de la chaine par les espaces
    listeMot = chaine.split(' ')
    for i in range(0,len(listeMot)):
        mot = listeMot[i]

        # Si le mot est dans la liste des minuscules
        if mot in listeMinuscule :
            listeMot[i] = mot.lower()

        # Sinon, si le mot contient une apostrophe
        elif "'" in mot :
            # Si le mot est en debut de nom alors la lettre precedant l apostrophe doit etre en majuscule
            if i == 0:
                listeMot[i] = mot.title()
            # Sinon la lettre precedant l apostrophe est en minuscule, les autres en majuscule
            else :
                motSplit = mot.split("'")
                # Condition permettant de verifier qu il n y avait bien qu une apostrophe
                if len(motSplit) == 2:
                    motSplit[0] = motSplit[0].lower()
                    # L utilisation de title() ici permet de gerer les mots post-apostrophe avec un tiret
                    motSplit[1] = motSplit[1].title()
                    listeMot[i] = "'".join(motSplit)

       # Sinon, si le mot contient un tiret
        elif '-' in mot :
            listeMot[i] = mot.title()

        # Sinon, si le mot contient un element de la liste upper il est mis en majuscule, sinon seulement sa premiere lettre
        else:
            # Si le mot passe en majuscule debute par un element de la liste, le mot est mis en majuscule
            up = False
            for el in listMajuscule:
                if mot.upper().startswith(el):
                    listeMot[i] = mot.upper()
                    up = True
            # Enfin, si le mot est passe a travers toutes les conditions sa premiere lettre est mise en majuscule
            if not up:
                listeMot[i] = mot.capitalize()
    return ' '.join(listeMot)
"""
    arcpy.CalculateField_management (mdb_data_proprietaire, arcpy.ListFields (mdb_data_proprietaire, "ADRESSE")[0].name, expression, "PYTHON_9.3", codeblock)

A+

Franck

Hors ligne

 

Pied de page des forums

Powered by FluxBB