Suite

Comprendre UnicodeDecodeError : codec 'utf8' dans le script ArcPy ?


Je travaille avec arcmap 10.3 et python 2.7.8. J'ai plus de 500 fichiers de formes situés dans de nombreux dossiers et sous-dossiers. Tous les sous-dossiers sont situés dans un grand répertoire. J'essaie avec arcpy de détecter tous les fichiers de formes qui ont dans leur table attributaire, dans le nom de champ "YEUD", la valeur 20. Je recherche tous les fichiers de formes qui commencent par les lettres "mig". Enfin, j'ai essayé d'imprimer tous les fichiers de formes trouvés avec la valeur 20. Quand je lance ce code :

import arcpy,os,fnmatch,unicodedata,codecs rootPath = r"C:Projectlayers" pattern = 'mig*.shp' pour root, dirs, files in os.walk(rootPath): pour le nom de fichier dans fnmatch.filter( fichiers, modèle): shp = os.path.join(root, filename) if arcpy.ListFields(shp, "YEUD"): print("{} has YEUD field".format(shp)) avec arcpy.da.SearchCursor (shp, ["YEUD"]) en tant que lignes : pour la ligne dans les lignes : si ligne[0] == 52 : print("{} a un enregistrement avec YEUD = ligne recherchée".format(shp)) break

j'obtiens une erreur lorsque le python rencontre des fichiers et des dossiers avec une police de droite à gauche :

UnicodeDecodeError : le codec 'utf8' ne peut pas décoder l'octet 0xe7 en position 23 : octet de continuation invalide

Pour être complet, j'ai posé cette question dans https://geonet.esri.com/message/519769#519769 et l'ai marquée comme réponse correcte pour les noms de fichiers et de dossiers écrits de gauche à droite, mais lorsque j'exécute ce code, j'obtiens une erreur lorsque le python rencontre des noms de fichiers et de dossiers avec des polices de droite à gauche.

Dans GeoNet, je n'ai pas reçu de réponse utile. J'ai également recherché des réponses dans stackOverflow mais je n'ai pas compris comment Unicode le script.


Vous essayez probablement de sortir des caractères Unicode dans le terminal qui ne les connaît pas. Je suggérerais plutôt d'écrire les résultats dans un fichier, afin que vous puissiez faire quelque chose comme ceci :

import arcpy,os,fnmatch,unicodedata,codecs rootPath = r"C:Projectlayers" pattern = 'mig*.shp' avec open('results.log', 'w') comme fichier journal : pour root, dirs, fichiers dans os.walk(rootPath): pour le nom de fichier dans fnmatch.filter(files, pattern): shp = os.path.join(root, filename) if arcpy.ListFields(shp, "YEUD") : logfile.write(u "{} a un champ YEUD
".format(shp).encode('utf8')) avec arcpy.da.SearchCursor(shp, ["YEUD"]) comme lignes : pour la ligne dans les lignes : si la ligne[0] == 52: logfile.write(u"{} a un enregistrement avec YEUD = want row".format(shp).encode('utf8')) break

Je n'ai pas de fichiers pour tester si cela fonctionne, cependant. Vous voudrez peut-être utiliser un codage différent de celuiutf8si cela ne fonctionne pas (probablement votre encodage national).


Voir la vidéo: CSV Encoding to UTF-8 format (Octobre 2021).