arcpy.Delete_management löscht keinen Geodatabase-Ordner

8

Dieses Skript wird beim ersten Mal einwandfrei ausgeführt, schlägt jedoch beim zweiten Ausführen fehl. Das Problem scheint zu sein, dass die Anweisung KMLToLayer_conversion eine Datei-Geodatabase erstellt (keine Überraschung), die anschließend nicht gelöscht werden kann, selbst wenn die Feature-Class aus der Karte entfernt, die Layer-Datei gelöscht und der Inhalt der Geodatabase gelöscht wird. Ich möchte nach mir selbst aufräumen, wenn dieses Skript mit allen Spuren außer den neuen Feature-Classes in MasterGDB fertig ist. Das Problem ist, dass dieses Skript nur einmal ausgeführt werden kann, es sei denn, Sie beenden ArcMap, löschen den Ordner in Windows manuell und starten ArcMap neu. Wenn Sie die einzelnen Befehle im Python-Fenster ausführen, wird zwangsläufig ein "" angezeigt, das Verzeichnis für die Geodatabase bleibt jedoch erhalten. Was fehlt diesem Neuling hier? (In diesem Test- / Debug-Skript gibt es nur eine einzige KML-Datei "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)
Tyla
quelle
versuche add arcpy.env.overwriteOutput = True und del wks, kmz, ... vielleicht hilft es
user7172
Verwenden Sie RefreshCatalog, bevor Sie den Ordner help.arcgis.com/de/arcgisdesktop/10.0/help/index.html#//…
iRfAn
Vielen Dank für Ihre beiden Kommentare. Insbesondere der "overwriteOutput" ist ein Juwel. Der RefreshCatalog schien keine Auswirkungen auf das Problem zu haben. Andererseits hat der ursprüngliche Code heute Morgen mit der neuen overwriteOutput-Zeile einwandfrei funktioniert. Ich vermute, der Neustart des Systems war Teil der Magie (Seufzer). Nun, um es in eine Produktionsversion "del" Anweisung enthalten zu enthalten.
Tyla

Antworten:

4

Ihre Identifikationsstufe muss eingerückt sein für:

arcpy.Delete_management(fgdb)

fgdb ist ein Element in Ihrer Schleife, auf dessen Referenz nicht zugegriffen werden kann, wie Sie es jetzt haben.

Versuchen:

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

arcpy.Delete_management(fcCopy)
arcpy.Delete_management("C:\\Temp\\Muledeer\\KKKLLL.lyr")
Artwork21
quelle
-2

Ich habe festgestellt, dass der folgende Löschaufruf korrekt ausgeführt wird.

if arcpy.Exists(fcName):
   arcpy.Delete_management(fcName)
sandyc
quelle
2
Ich bin mir nicht sicher, wie dies die Frage des OP beantwortet.
Devdatta Tengshe
1
Das Hinzufügen des if arcpy.ExistsTeils funktioniert nicht Delete_management, wenn es aus irgendeinem Grund bereits fehlschlägt. (Nur versucht und verifiziert.)
Erica