Mehr

Fehler mit meinem Python-Skript


Ich versuche, eine Zeichenfolge zu schreiben, die ein Fehlerprotokoll aufruft. Hier ist der Fehler, den ich erhalte:

Python-Ausnahme : [Errno 22] ungültiger Modus ('r') oder Dateiname: 'C:BenutzerKyleUnterlagenGRENZEProjekt1_varasett2frogsV2Frogs_detaillog_20151110_142249916000.txt'

Das FMEMacro DETAIL LOG ist das, was auf diesen Dateinamen eingestellt ist. Ich bin nicht der Beste in Python und habe Probleme, herauszufinden, wo ich einen Fehler gemacht habe.

Die von mir verwendeten Programme sind FME und ArcMap 10.3

Hier ist das gesamte Skript:

import fme import sys import fmeobjects import datetime import time # Template Funktionsschnittstelle: def processFeature(feature): endstamp = datetime.datetime.now() endstamp = endstamp.strftime("%Y-%m-%d %H:%M :%S.%f") dataset_list = feature.getAttribute('DATABASE_NAME').split(',') dataset_list = list(set(dataset_list)) dataset_list.sort() dataset_list = ', '.join(dataset_list) # Lesen Sie das Detailprotokoll und extrahieren Sie die Zusammenfassungsdaten mit open(FME_MacroValues['DETAIL_LOG'], "r") als ins: delete_count = 0 insert_count = 0 update_count = 0 redundant_count = 0 error_count = 0 action_list = [] merged_list = [] für Zeile in ins: line_array = line.split(' :: ') line_action = line_array[3].replace('
',") action_list.append(line_action) if line_action.upper() == 'delete': delete_count += 1 elif line_action.upper() == 'insert': insert_count += 1 elif line_action.upper() == 'update': update_count += 1 elif line_action.upper() == 'redundant': redundant_count += 1 elif line_action.upper() == 'Fehler': error_count += 1 # E-Mail-Text/Zusammenfassung erstellen (einschließlich Speicherort des Detailprotokolls) email_body = "DAS IST EIN MOCK RUN - KEINE SCHREIBER WURDEN AKTIVIERT 
" email_body += "Start:	" + FME_MacroValues['Time'] + " n" email_body += "Finish:	" + Endstamp + "
 
" email_body += "Eingefügt:	" + str(insert_count) + "
" email_body += "Aktualisiert:	" + str (update_count) + "
" email_body += "Gelöscht:	" + str(delete_count) + "
" email_body += "Redundant:	" + str(redundant_count) + "
" email_body += " Errors:		" + str(error_count) + "
 
" # E-Mail mit Detailprotokoll als Anhang senden # Attribute zum Debuggen ausgeben feature.setAttribute('body',email_body)

Ja, FME verwendet ein internes Kodierungssystem (wir nennen es What Would Juan Do, da Juan unser XML-Experte ist).

ich Überlegen was Sie tun müssen, ist die Methode decodeFromFMEParsableText anzuwenden. Ich bin kein Programmierexperte, daher gebe ich Ihnen die Informationen, die ich habe, und hoffe, dass es entweder hilft oder jemand hier helfen kann.

Ich habe dies aus der API-Dokumentation (siehe C:appsFMEfmeobjectspythonapidocIndex.html)


Modul fmeobjects :: Klasse FMESession

Methode: decodeFromFMEParsableText(parsableText)

Dieses Verfahren führt eine Modifikation des Unicode-Strings vom parsierbaren FME-codierten Text zurück in eine nicht-codierte Form durch. Beispielsweise wird ' durch ';' ersetzt. Wenn die Dekodierung für eine bestimmte Zeichenfolge fehlschlägt, behält die resultierende Ausgabe diese Zeichenfolge bei.

Parameter:

parsableText (String oder Unicode) – FME-kodierter Text als String oder Unicode.

Rückgabe: Unicode Nicht kodierter Text als Unicode.


Mein Kollege sagt mir, dass Sie etwas tun möchten wie:

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

Also ich vermute:

session = fmeobjects.FMESession() decoded = session.decodeFromFMEParsableText(FME_MacroValues['DETAIL_LOG']) with open(decoded, "r") als ins:

'C:BenutzerKyleUnterlagenGRENZEProjekt1_varasett2frogsV2Frogs_detaillog_20151110_142249916000.txt'ist als Pfad ungültig. Es scheint, dass bestimmte Symbole durch Wörter ersetzt werden. Ich weiß nichts über FMEMacro DETAIL LOGs, aber als Workaround können Sie so etwas versuchen:

pathName = FME_MacroValues['DETAIL_LOG'] fixedPathName = pathName.replace ("", "").ersetzen ("", "-") mit open(fixedPathName, "r") als ins:…

Der obige Code ersetzt die Wörter durch ihre richtigen Symbole. Hinzufügen.ersetzen ()wie benötigt.