Este script se ejecuta bien la primera vez pero falla cuando se ejecuta la segunda vez. El problema parece ser que la instrucción KMLToLayer_conversion crea una geodatabase de archivos (no es de extrañar) que posteriormente no se puede eliminar incluso cuando la clase de entidad se elimina del mapa, el archivo de capa y el contenido de la geodatabase se eliminan. Me gustaría limpiar después de mí mismo cuando este script haya terminado con todos los rastros que no sean las nuevas clases de entidad dentro de MasterGDB. El problema es que este script solo se puede ejecutar una vez a menos que salga de ArcMap, elimine manualmente la carpeta en Windows y luego reinicie ArcMap. La ejecución de los comandos individuales dentro de la ventana de Python inevitablemente muestra un "" pero el directorio para la geodatabase permanece. Entonces, ¿qué falta este novato aquí? (En este script de prueba / depuración, solo hay un único archivo KML "C:
import arcpy, os
# Name: BatchKML_to_GDB.py
# Source: AS16818.ZIP from acripts.esri.com
import arcpy, os
# Set local variables and location for the consolidated file geodatabase
KMLDir = "C:\TEMP\KML3"
outLocation = "C:\\Temp\\MuleDeer"
MasterGDB = 'AllKLM5.gdb'
MasterGDBLocation = os.path.join(outLocation, MasterGDB)
# Create the master FileGeodatabase as needed
if not (arcpy.Exists(MasterGDBLocation)):
print MasterGDBLocation + " doesn't exist; creating it now"
arcpy.CreateFileGDB_management(outLocation, MasterGDB)
# Convert all KMZ and KML files found in the current workspace
# Set workspace (where all the KMLs are)
arcpy.env.workspace=KMLDir
for kmz in arcpy.ListFiles('*.KM*'):
print "CONVERTING: " + os.path.join(arcpy.env.workspace,kmz)
kmz2 = os.path.join(arcpy.env.workspace,kmz)
arcpy.KMLToLayer_conversion(kmz2, outLocation)
print "Done"
# Change the workspace to fGDB location
arcpy.env.workspace = outLocation
# Loop through all the FileGeodatabases within the workspace
wks = arcpy.ListWorkspaces('*', 'FileGDB')
# Drop Master GDB from the array/list
wks.remove(MasterGDBLocation)
for fgdb in wks:
# Change the workspace to the current FileGeodatabase
arcpy.env.workspace = fgdb
featureClasses = arcpy.ListFeatureClasses('*', '', 'Palacemarks')
for fc in featureClasses:
fcCopy = fgdb + os.sep + 'Placemarks' + os.sep + fc
arcpy.FeatureClassToFeatureClass_conversion(fcCopy, MasterGDBLocation, fgdb[fgdb.rfind(os.sep)+1:-4])
arcpy.Delete_management(fcCopy)
arcpy.Delete_management("C:\\Temp\\Muledeer\\KKKLLL.lyr")
arcpy.Delete_management(fgdb)
fuente
Respuestas:
Su nivel de ideación debe ser sangrado para:
fgdb es un elemento dentro de su ciclo al que no se puede acceder a su referencia como lo tiene ahora.
Tratar:
fuente
Descubrí que la siguiente llamada de eliminación se completa correctamente.
fuente
if arcpy.Exists
parte no haceDelete_management
que funcione si ya está fallando por alguna razón. (Solo lo probé y verifiqué)