Fehlerbehandlung mit Python-Skript in ArcGIS 10

10

Ich habe ein Python-Skript, mit dem ich eine Liste aller MXD-Dateien (mit vollständigem Pfad) in unserem Projektordner erstelle. Das Skript verwendet dies dann, um die Liste zu durchlaufen und auf jedem mxd nach ESRIs Vorgehensweise einen Arbeitspfad zu finden und zu ersetzen. Ich habe Probleme, wenn ich auf eine beschädigte MXD-Datei stoße. Die haben versucht / außer und haben es nicht zum Laufen gebracht. Die ideale Situation wäre, den beschädigten Dateinamen in eine Datei zu schreiben und fortzufahren, damit ich am Ende darauf zurückkommen kann. Ich bin sehr neu in Python-Skripten, jede Hilfe wäre sehr dankbar.

import arcpy, os, sys, traceback, time

oldpath = 'W:'
newpath = 'W:\\GIS'

def find(path,pattern):
    matches = []
    for r,d,f in os.walk(path):
        for files in f:
            if files.endswith(pattern):
                fpath = os.path.join(r,files)
                matches.append(fpath)
                print (fpath)
    return matches


print ("Go: ")
mxdlist = (find('C:\\gis','.mxd'))
print (mxdlist)


print ("Starting Path Conversion")
try:
        for mxdold in mxdlist:
            mxd = arcpy.mapping.MapDocument(mxdold)
            mxd.findAndReplaceWorkspacePaths(oldpath, newpath)
            time.sleep(6)
            mxd.save()
            time.sleep(6)
            print (mxdold)
            del mxd
    except arcpy.ExecuteError:    
        arcpy.AddError(arcpy.GetMessages(2))    

    except:    
        arcpy.AddError("Non-tool error occurred")
Bworthington
quelle

Antworten:

7

Als erstes müssen Sie den oberen Rand Ihrer forSchleife außerhalb der tryAnweisung platzieren. Sie möchten mit Ihrer Iteration beginnen, bevor Sie der tryAnweisung die Möglichkeit geben, Ihre Operation zu beenden. Als Nächstes möchten Sie einige Zeilen hinzufügen, um ein Fehlerprotokoll zu öffnen und Dateinamen beschädigter Dateien zu schreiben.

import arcpy, os, sys, traceback, time

oldpath = 'W:\\'
newpath = 'W:\\GIS'
cgis_dir = 'C:\\gis'

mxdlist = []

print 'Go: '
files = os.listdir(cgis_dir)
for file in files:
    try:
        if file.split('.')[1] == 'mxd':
            mxdlist.append(file)
            print cgis_dir,file
    except:
        pass


print ("Starting Path Conversion")

for mxdold in mxdlist:
    try:
        mxd = arcpy.mapping.MapDocument(mxdold)
        mxd.findAndReplaceWorkspacePaths(oldpath, newpath)
        time.sleep(6)
        mxd.save()
        time.sleep(6)
        print (mxdold)
        del mxd
    except arcpy.ExecuteError:    
        arcpy.AddError(arcpy.GetMessages(2))
        f=open(r'W:\GIS\error.log','a')
        f.write(mxdold,'\n')
        f.close()

    except:    
        arcpy.AddError("Non-tool error occurred")
Jason
quelle
2
+1 Schön, schlag mich! Öffnen Sie die Protokolldatei jedoch nicht mit 'w'(rite) - verwenden 'a'Sie stattdessen (ppend), als ob es mehr als einen beschädigten mxd gibt, den Sie jedes Mal überschreiben werden. Es kann auch übertrieben sein, aber das Python- loggingModul ist möglicherweise einen Blick wert, um Fehler aufzuzeichnen.
om_henners
Netter Fang ... Der Code zum Öffnen der Datei 'a'zum Anhängen wurde korrigiert.
Jason
Es schlägt immer noch mit dem geänderten Code fehl. Ich habe überprüft, dass die Dateien nicht beschädigt sind, aber ich erhalte sie dort, wo Windows 7 behauptet, dass sie hängen geblieben sind und das Skript beendet haben. Irgendwelche Ideen?
Bworthington
Was ist der Fehler, den Sie erhalten? Können Sie den Rest des Codes posten?
Jason
1
Ich habe 2 Vorschläge: 1. Erfinden Sie die Protokollierung und die Protokolldateien nicht neu. Ich habe eine kleine Python-Protokollierungsanleitung unter sgillies.net/blog/832/python-logging , die andere gute Links enthält. 2. Ziehen Sie in Betracht, den Aufruf von arcpy.AddError zu beenden, da Sie Ihre eigene Handleraktion schreiben.
Sgillies
3

Dies hat nichts mit Ihrem Fehler auf den beschädigten MXDs zu tun. Da Sie sich jedoch anmelden möchten, finden Sie hier ein kleines Nugget (ziemlich direkt aus den Python-Dokumenten), das das loggingModul verwendet (wie von @om_henners vorgeschlagen). @sgillies Kommentar oben sieht auch ausgezeichnet aus.

import logging
import datetime
import os

date_tag = datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
log_file = os.path.join(os.path.dirname(os.curdir), "LogFileTest_%s.log" % date_tag)

# Setup logger
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)-8s %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S',
                    filename=log_file,
                    filemode='w')
logging.info(': START LOGGING')

try:
    logging.info(": Do something here")
except Exception, err:
    logging.error(": %s" % str(err))

Wenn es so ausgeführt wird, wie es ist, gibt es:

Geben Sie hier die Bildbeschreibung ein

Chad Cooper
quelle