Pages: 1
- Sujet précédent - Python calcul d'un champs par rapport aux valeurs d'un autre - Sujet suivant
#1 Fri 17 July 2015 15:34
- Allererste
- Participant occasionnel
- Date d'inscription: 11 Aug 2011
- Messages: 16
Python calcul d'un champs par rapport aux valeurs d'un autre
Bonjour,
Je commence sur python et j'ai voulu créé un petit code simple qui a pour but:
1) De découper une table d'occupation du sol par rapport a un périmètre
2) D'ajouter une colonne a la table d'occupation du sol ainsi obtenue
3) De calculer des valeurs dans le champ ajouté a cette table
C'est la troisième étape qui me pose problème, je n'arrive pas a calculer un champ à partir d'un autre, en résumé je voudrais que:
Quand le champ LIB2011_1 contient la valeur "Milieux naturels et forestiers" mon champ qui se nomme TB soit rempli de la valeur "OUI" et pour toutes les autres valeurs de LIB2011_1 il soit rempli de la valeur "NON"
Exemple de la phase 3 de mon code:
# Set local variables
inTable = "C:/Users/xx/Documents/MXD_exo/zoneclip.shp"
fieldName1 = "TB"
expression = "Reclass(text(!LIB2011_1!))" #c'est cette partie qui me pose problème
codeblock = """def Reclass(LIB2011_1):
if LIB2011_1 == Milieux naturels et forestiers:
return OUI
else:
return NON"""
# Execute CalculateField
arcpy.CalculateField_management(inTable, fieldName1,expression, "PYTHON_9.3", codeblock)
Hors ligne
#2 Fri 17 July 2015 18:44
- Minotaure
- Participant occasionnel
- Date d'inscription: 7 Aug 2014
- Messages: 32
Re: Python calcul d'un champs par rapport aux valeurs d'un autre
Bonjour.
J'enfonce peut être une porte ouverte, mais à première vue il manque des guillemets autour de "Milieux naturels et forestiers" pour que la comparaison puisse être effectuée. non ?
ἀγεωμέτρητος μηδεὶς εἰσίτω
Hors ligne
#3 Fri 17 July 2015 18:51
Re: Python calcul d'un champs par rapport aux valeurs d'un autre
Bonjour,
Quel est le message d'erreur que vous obtenez ?
Il me semble que la fonction "text()" n'existe pas en Python...
Il est possible d'utiliser la classe str.
A+
Franck
Hors ligne
#4 Sat 18 July 2015 09:26
- Allererste
- Participant occasionnel
- Date d'inscription: 11 Aug 2011
- Messages: 16
Re: Python calcul d'un champs par rapport aux valeurs d'un autre
J'ai essayé ça :
Code:
# Set local variables inTable = "C:/Users/Jean-Philippe/Documents/MXD_exo/zoneclip.shp" fieldName1 = "TB" expression = "Reclass(str(!LIB2011_1!))" codeblock = """def Reclass(LIB2011_1): if LIB2011_1 == "Milieux naturels et forestiers": return OUI else: return NON""" # Execute CalculateField arcpy.CalculateField_management(inTable, fieldName1,expression, "PYTHON_9.3", codeblock)
et j'ai ce message d'erreur:
Exécution du script Script...
<class 'arcgisscripting.ExecuteError'>: ERROR 000539: Error running expression: Reclass(str("Espaces artificialisés")) <type 'exceptions.NameError'>: global name 'NON' is not defined
Échec de l’exécution de (CalculateField).
Échec de l’exécution de (Script).
Échec à Sat Jul 18 09:24:13 2015 (temps écoulé : 15,00 secondes)
Hors ligne
#5 Sat 18 July 2015 11:43
Re: Python calcul d'un champs par rapport aux valeurs d'un autre
Bonjour,
Il manque des guillemets autour de vos chaînes de retour.
Un mot sans guillemets est forcément soit un mot clé du langage ou un nom de variable dans presque tous les langages de programmation.
C'est le sens du message d'erreur Python :
<type 'exceptions.NameError'>: global name 'NON' is not defined
Le script corrigé :
Code:
# Set local variables inTable = "C:/Users/Jean-Philippe/Documents/MXD_exo/zoneclip.shp" fieldName1 = "TB" expression = "Reclass(str(!LIB2011_1!))" codeblock = """def Reclass(LIB2011_1): if LIB2011_1 == "Milieux naturels et forestiers": return 'OUI' else: return 'NON'""" # Execute CalculateField arcpy.CalculateField_management(inTable, fieldName1,expression, "PYTHON_9.3", codeblock)
A+
Franck
Hors ligne
#6 Sat 18 July 2015 14:02
- Allererste
- Participant occasionnel
- Date d'inscription: 11 Aug 2011
- Messages: 16
Re: Python calcul d'un champs par rapport aux valeurs d'un autre
En tapant ce code :
Code:
inTable = "C:/Users/Jean-Philippe/Documents/MXD_exo/zoneclip.shp" fieldName1 = "TB" expression = "getClass(!TB!)" codeblock = """def getClass(LIB2011_1): if LIB2011_1 == 'Milieux naturels et forestiers': return 'OUI' else: return 'NON'""" # Execute CalculateField arcpy.CalculateField_management(inTable, fieldName1,expression, "PYTHON_9.3", codeblock)
La colonne "TB" est remplie mais uniquement de "NON" ! Pas de "OUI" en face de "Milieux naturels et forestiers.
Mais déjà on avance merci pour vos réponses
Hors ligne
#7 Sat 18 July 2015 15:42
Re: Python calcul d'un champs par rapport aux valeurs d'un autre
Forcément
Il faudrait mettre :
Code:
expression = "getClass(!LIB2011_1)"
Et non :
Code:
expression = "getClass(!TB!)"
Ton code fait un calcul sur le champ TB à partir des valeurs du champ TB.
A+
Hors ligne
#8 Sat 18 July 2015 18:17
- Allererste
- Participant occasionnel
- Date d'inscription: 11 Aug 2011
- Messages: 16
Re: Python calcul d'un champs par rapport aux valeurs d'un autre
Parfait ca marche !
Merci beaucoup pour votre aide.
Pour info le code qui fonctionne :
Code:
inTable = "C:/Users/Jean-Philippe/Documents/MXD_exo/zoneclip.shp" fieldName1 = "TB" expression = "getClass(!LIB2011_1!)" codeblock = """def getClass(LIB2011_1): if LIB2011_1 == 'Milieux naturels et forestiers': return 'OUI' else: return 'NON'""" # Execute CalculateField arcpy.CalculateField_management(inTable, fieldName1,expression, "PYTHON_9.3", codeblock)
Hors ligne
Pages: 1
- Sujet précédent - Python calcul d'un champs par rapport aux valeurs d'un autre - Sujet suivant