For loop per l'accesso a una directory file in ArcPy
Ho un Python Toolbox e voglio usare una directory per leggere diversi shapefile. Ma quando eseguo lo script funziona solo per la prima forma.
fd è la directory e il codice è:
fd= parameters[0].valueAsText
raster= parameters[1].valueAsText
mar="Z:\\Datos_centralizados\\OSM_coastlines\\water_polygons.shp"
out= "Z:\\EMSV-057_AOIs_Reshape\\5_Process\\1_TaskA\\ModelBuilder\\MB_pruebas.gdb"
#-------------------------
#leemos los shapes de la carpeta y los metemos a una lista
flist = []
for root,folder,files in os.walk(fd):
for file in files:
if os.path.isfile(os.path.join(root,file)) and file.endswith('.shp'):
flist.append(os.path.join(root,file))
for z in flist:
shape=z
# Cogemos datos alfanumericos del AOI
desc = arcpy.Describe(shape)
# aplicamos la herramienta Erase para quedarnos con la tierra
erase=arcpy.Erase_analysis(shape,mar, out+"\\Tierra", cluster_tolerance="")
# Estadisticos
tZONA=arcpy.gp.ZonalStatisticsAsTable_sa(erase, "FID", raster, out+"\\tabla_Zona", "NODATA", "SUM")
Risposte
Ecco quattro approcci. Il primo utilizza la Walkfunzione arcpy . Il secondo, terzo e quarto approccio usano moduli Python incorporati. Il quarto approccio è quello che hai fornito.
Ecco i benchmark temporali per cercare ricorsivamente una grande directory:
Method 1: 15.0 seconds (arcpy.Walk)
Method 2: 140.0 seconds (os.Walk and fnmatch.filter)
Method 3: 4.0 seconds (glob.glob)
Method 4: 287.0 seconds (os.Walk)
Chiaramente il Metodo 3 è il più veloce, anche se questo perché la ricerca è relativamente semplice (cioè cercare un'estensione che soddisfi determinate condizioni). Notare che il metodo 3 richiede l'utilizzo di globPython 3. Il metodo 1 è preferibile se è necessario isolare, ad esempio, classi di caratteristiche puntuali o altri tipi di dati specifici.
directory = r'C:\path\to\your\directory'
# Method 1 (Python 2.7)
import arcpy
import os
feature_classes = []
walk = arcpy.da.Walk(directory, datatype = "FeatureClass")
for dirpath, dirnames, filenames in walk:
for filename in filenames:
check = os.path.join(dirpath, filename)
if os.path.isfile(check) and check.endswith(".shp"):
feature_classes.append(os.path.join(dirpath, filename))
# Method 2 (Python 2.7)
import fnmatch
import os
matches = []
for root, dirnames, filenames in os.walk(directory):
for filename in fnmatch.filter(filenames, '*.shp'):
if os.path.isfile(os.path.join(root, filename)):
matches.append(os.path.join(root, filename))
# Method 3 (Python 3.8)
import glob, os
shps = [x for x in glob.glob(os.path.join(directory, "**", "*.shp"), recursive = True) if os.path.isfile(x) and x.endswith(".shp")]
# Method 4 (Python 2.7)
import arcpy
import os
flist = []
for root,folder,files in os.walk(directory):
for f in files:
if os.path.isfile(os.path.join(root,f)) and f.endswith('.shp'):
flist.append(os.path.join(root,f))