#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
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
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
Re: Message erreur Python
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
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