Error al manejar con script de Python en ArcGIS 10

10

Tengo un script de Python que estoy usando para crear una lista de todos los archivos mxd (con ruta completa) en nuestra carpeta Proyectos. El script luego lo usa para recorrer la lista y hacer una búsqueda y reemplazar rutas de espacio de trabajo en cada mxd según las instrucciones de ESRI. Me encuentro con problemas cuando llego a un archivo mxd dañado. Han intentado probar / excepto y no han conseguido que funcione. La situación ideal sería escribir el nombre de archivo corrupto en un archivo y seguir adelante para que pueda volver a ellos al final. Soy muy nuevo con las secuencias de comandos de Python, cualquier ayuda sería muy apreciada.

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
fuente

Respuestas:

7

Lo primero que debe hacer es sacar la parte superior de su forciclo fuera de la trydeclaración. Desea entrar en su iteración antes de darle a la trydeclaración la oportunidad de matar su operación. A continuación, querrá agregar algunas líneas para abrir un registro de errores y escribir nombres de archivos corruptos.

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
fuente
2
+1 ¡Agradable, me ganas! Sin embargo, no abra el archivo de registro con 'w'(rite); use 'a'(ppend) como si hubiera más de un mxd corrupto que sobrescribirá cada vez. Además, puede ser excesivo, pero loggingvale la pena mirar el módulo Python para registrar errores.
om_henners
Buena captura ... arregló el código para abrir el archivo 'a'para agregar.
Jason
Todavía está fallando con el código modificado. Verifiqué que los archivos no están dañados, pero lo obtengo donde Windows 7 afirma que se ha bloqueado y mata el script. ¿Algunas ideas?
bworthington
¿Cuál es el error que estás recibiendo? ¿Puedes publicar el resto del código?
Jason
1
Tengo 2 sugerencias: 1. No reinventes el registro y los archivos de registro. Tengo un pequeño tutorial sobre el registro de Python en sgillies.net/blog/832/python-logging que tiene otros buenos enlaces. 2. Considere abandonar la llamada a arcpy.AddError ya que está escribiendo su propia acción de controlador.
sgillies
3

Esto no tiene nada que ver con su error en los MXD corruptos, pero dado que desea iniciar sesión, aquí hay una pequeña pepita (casi directamente de los documentos de Python) que usa el loggingmódulo (como lo sugiere @om_henners). El comentario de @sgillies anterior también se ve excelente.

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))

Cuando se ejecuta como está, da:

ingrese la descripción de la imagen aquí

Chad Cooper
fuente