J'ai quelques fichiers de formes où certains des attributs contiennent les caractères non anglais ÅÄÖ. Étant donné que certaines requêtes ne fonctionnent pas avec ces caractères (en particulier ChangeDetector ), j'ai essayé de les modifier à l'avance avec un script simple et d'ajouter les nouvelles chaînes à un autre champ.
Cependant, la modification des caractères fonctionne correctement mais ne met pas à jour le champ avec arcpy.UpdateCursor.
Quelle est la manière appropriée de résoudre ce problème?
J'ai également essayé de le faire via la calculatrice de champ lors de la publication de "code" sur le bloc de code, avec la même erreur.
Message d'erreur:
Erreur d'exécution Traceback (dernier appel le plus récent): Fichier "", ligne 1, dans Fichier "c: /gis/python/teststring.py", ligne 28, dans val = code (str (prow.Typkod)) UnicodeEncodeError: le codec 'ascii' ne peut pas coder le caractère u '\ xc4' en position 3: l'ordinal n'est pas dans la plage (128)
Code:
# -*- coding: cp1252 -*-
def code(infield):
data = ''
for i in infield:
## print i
if i == 'Ä':
data = data + 'AE'
elif i == 'ä':
data = data + 'ae'
elif i == 'Å':
data = data + 'AA'
elif i == 'å':
data = data + 'aa'
elif i == 'Ö':
data = data + 'OE'
elif i == 'ö':
data = data + 'oe'
else:
data = data + i
return data
shp = r'O:\XXX\250000\DB\ArcView\shape.shp'
prows = arcpy.UpdateCursor(shp)
for prow in prows:
val = code(unicode(str(prow.Typkod), "utf-8"))
prow.Typkod_U = val
print val
prows.updateRow(prow)
Les valeurs de Typkod sont du type: [D, D, S, DDRÄ, TRÄ] etc.
J'utilise ArcMap Basic (10.1) sur Windows 7.
Nouveau message d'erreur:
Erreur d'exécution Traceback (dernier appel le plus récent): Fichier "", ligne 1, dans Fichier "c: /gis/python/teststring.py", ligne 29, dans val = code (unicode (str (ligne. Typkod), "utf-8")) UnicodeEncodeError: le codec 'ascii' ne peut pas coder le caractère u '\ xc4' en position 3: ordinal pas dans la plage (128)
>>> val
'DDRÄ'
>>> type(val)
type 'str'
Il semble que la sortie de la fonction soit incorrecte d'une manière ou d'une autre. Quand ÅÄÖ est impliqué, il revient data = u'DDR\xc4'
et non (comme c'était mon intention) data = 'DDRAE'
. Des suggestions sur ce qui pourrait provoquer cela?
Il s'avère que l'itération de ÅÄÖ n'a pas été aussi simple. Il est appelé chaîne unicode et lors de l'archivage des instructions if qui doivent être utilisées à la place du littéral ÅÄÖ. Après avoir compris cela, le reste était un morceau de gâteau :)
Code résultant:
la source
Voyez si les éléments suivants fonctionnent:
la source
val
, mais pas pour l'écrire dans la ligne actuelle (la ligne suivante). [Mise à jour de la question avec cette modification.]