Daha çox

UnicodeDecodeError'u başa düşmək: ArcPy skriptində 'utf8' codec?


Arcmap 10.3 və python 2.7.8 ilə işləyirəm. Bir çox qovluqda və alt qovluqda yerləşən 500-dən çox shapefile sahibəm. Bütün alt qovluqlar böyük bir qovluqdadır. Arcpy ilə atribut cədvəlindəki bütün formalı sənədləri, sahə adı "YEUD", 20-ni aşkar etməyə çalışıram. "Mig" hərfləri ilə başlayan bütün formalı sənədləri axtarıram. Nəhayət içərisində 20 dəyəri olan bütün formaları çap etməyə çalışdım. Bu kodu çalıştırdığım zaman:

idxal arcpy, os, fnmatch, unicodedata, codecs rootPath = r "C:  Project  layer" pattern = 'mig * .shp' for root, dirs, files for os.walk (rootPath): file name for fnmatch.filter ( fayllar, naxış): arcpy.ListFields (shp, "YEUD") olduqda shp = os.path.join (kök, fayl adı): arcpy.da.SearchCursor ilə çap ("{} YEUD sahəsi var" .format (shp)) (shp, ["YEUD"]) sətirlər kimi: sətirlərdə sətir üçün: əgər sətir [0] == 52: çap ("{} YEUD = axtarılan sətir" qeydinə malikdir .format (shp)) qırmaq

Python faylları və qovluqları sağdan sola yazı tipi ilə qarşıladığında bir səhv alıram:

UnicodeDecodeError: 'utf8' codec 0xe7 baytını 23 mövqedə deşifr edə bilmir: etibarsız davam baytı

Tamam üçün bu sualı https://geonet.esri.com/message/519769#519769-da soruşdum və soldan sağa yazı şriftində yazılmış fayl və qovluq adları üçün düzgün cavab olaraq qeyd etdim, amma bu kodu işə saldığım zaman alıram python faylları və qovluq adlarını sağdan sola yazı tipləri ilə qarşılaşdırdıqda bir səhv.

GeoNet-də faydalı cavab almadım. Mən də cavabları stackOverflow-da axtardım, ancaq skriptin unicode kodunu necə açmağı başa düşmədim.


Yəqin ki, Unicode simvollarını tanımayan terminala çıxartmağa çalışırsınız. Bunun əvəzinə nəticələri bir fayla yazmağı məsləhət görərdim, belə bir şey edə bilərsiniz:

arcpy, os, fnmatch, unicodedata, codecs rootPath = r "C:  Project  layer" pattern = 'mig * .shp' açıq ('results.log', 'w') ilə logfile olaraq daxil edin: root, dirs, os.walkdakı fayllar (rootPath): fnmatch.filter-dəki fayl adı üçün (fayllar, şablon): shp = os.path.join (kök, fayl adı) əgər arcpy.ListFields (shp, "YEUD"): logfile.write (u "{} YEUD sahəsinə malikdir  n". arcpy.da.SearchCursor (shp, ["YEUD"]) ilə satır şəklində format (shp) .encode ('utf8')): satır sıra üçün: əgər satır [0] == 52: logfile.write (u "{} YEUD ilə bir qeydə sahib = satır istəndi" .format (shp) .encode ('utf8')) break

İşlədiyini yoxlamaq üçün heç bir sənədim yoxdur. Daha fərqli bir kodlama istifadə etmək istəyə bilərsinizutf8işə yaramırsa (ehtimal ki, milli kodlaşdırma).