Daha çox

Python skriptimdə səhv

Python skriptimdə səhv


Xəta jurnalına çağıracaq bir sətir yazmağa çalışıram. Aldığım səhv:

Python İstisnası : [Errno 22] etibarsız rejim ('r') və ya fayl adı: 'C:İstifadəçilərKyleSənədlərFRONTIERProject1_varasett2frogsV2Frogs_detaillog_20151110_142249916000.txt '

FMEMacro DETAIL LOG, bu fayl adına qoyulmuşdur. Python-da ən yaxşısı deyiləm və harada səhv etdiyimi anlamağa çalışan problemlərim var.

İstifadə etdiyim proqramlar FME və ArcMap 10.3-dür

Bütün ssenari budur:

idxal fme idxal sys idxal fmeobjects idxal vaxtı idxal vaxtı # Şablon İşlev interfeysi: def processFeature (xüsusiyyət): endstamp = datetime.datetime.now () endstamp = endstamp.strftime ("% Y-% m-% d% H:% M :% S.% f ") Database_list = feature.getAttribute ('DATABASE_NAME'). Split (',') Database_list = List (Set (Database_list)) Database_list.sort () Database_list = ',' .join (Datas_list) # Təfərrüatlar jurnalını oxuyun və xülasə məlumatlarını açıq (FME_MacroValues ​​['DETAIL_LOG'], "r") şəklində daxil edin: delete_count = 0 insert_count = 0 update_count = 0 redundant_count = 0 error_count = 0 action_list = [] merged_list = [] ins: line_array = line.split ('::') line_action = line_array [3]. dəyişdirin (' n', ") action_list.append (line_action) əgər line_action.upper () == 'sil': delete_count + = 1 elif line_action.upper () == 'insert': insert_count + = 1 elif line_action.upper () == 'update': update_count + = 1 elif line_action.upper () == 'lazımsız': redundant_count + = 1 elif line_action.upper () == 'səhv': error_count + = 1 # E-poçt gövdəsi / xülasəsi yaradın (detallar jurnalının yeri daxil olmaqla) email_body = "BU MOCK RUN - YAZICILAR İŞTİRAK EDİLMƏDİ  n" email_body + = "Başlayın:  t" + FME_MacroValues ​​['Zaman'] + " n "email_body + =" Bitir:  t "+ endstamp +"  n  n "email_body + =" Daxil edildi:  t "+ str (insert_count) +"  n "email_body + =" Yeniləndi:  t "+ str (update_count) + " n" email_body + = "Silindi:  t" + str (delete_count) + " n" email_body + = "Yedək:  t" + str (redundant_count) + " n" email_body + = " Xətalar:  t  t "+ str (error_count) +"  n  n "# E-poçt ilə ətraflı qeyd jurnalını əlavə olaraq göndərin # Xətası çıxartmaq üçün xüsusiyyətlər. SetAttribute ('bədən', email_body)

Yep, FME daxili bir kodlaşdırma sistemindən istifadə edir (Juan XML mütəxəssisimiz olduğu üçün Juan nə edərdi deyirik).

Mən düşün nə etməli olduğunuzu decodeFromFMEParsableText metodunu tətbiq etməkdir. Mən bir proqramlaşdırma mütəxəssisi deyiləm, ona görə də əlimdə olan məlumatları verəcəyəm və ümid edirəm kömək edəcək və ya burada kimsə kömək edə bilər.

Bunu API sənədlərindən aldım (bax C: apps FME fmeobjects python apidoc Index.html)


Modul fmeobjects :: Class FMESession

Metod: decodeFromFMEParsableText (parsableText)

Bu metod unicode sətrinin ayrıştırıla bilən FME kodlanmış mətnindən kodlanmamış formaya dəyişdirilməsini həyata keçirir. Məsələn, ';' ilə əvəz ediləcəkdir. Əgər dekodlaşdırma müəyyən bir xarakter ardıcıllığı üçün uğursuz olarsa, nəticədə həmin xarakter ardıcıllığı qorunub saxlanacaqdır.

Parametrlər:

parsableText (string və ya unicode) - FME kodlu mətn simli və ya unicode kimi.

Qaytarır: unicode Unicode olaraq kodlanmamış mətn.


Həmkarım mənə belə bir şey etmək istədiyinizi söyləyir:

session = fmeobjects.FMESession () decoded = session.decodeFromFMEParsableText (WWJDStringVAR)

Buna görə təxmin edirəm:

sessiya = fmeobjects.FMESession () decoded = session.decodeFromFMEParsableText (FME_MacroValues ​​['DETAIL_LOG']) ilə açıq (dekodlanmış, "r") əlavə olaraq:

'C:İstifadəçilərKyleSənədlərFRONTIERProject1_varasett2frogsV2Frogs_detaillog_20151110_142249916000.txt 'bir yol kimi etibarsızdır. Bəzi simvolların sözlərlə əvəz olunduğu görünür. FMEMacro DETAIL LOG'ları haqqında bir şey bilmirəm, ancaq ətrafınızdakı bir iş olaraq belə bir şey sınaya bilərsiniz:

pathName = FME_MacroValues ​​['DETAIL_LOG'] fixPathName = pathName.replace ("","  "). dəyişdirin (""," - ") açıq olaraq (fixedPathName," r ") əlavə olaraq:…

Yuxarıdakı kod sözləri uyğun işarələri ilə əvəz edir. Əlavə et. dəyişdirin ()lazım olduqda.