For loop per l'accesso a una directory file in ArcPy

Sep 16 2020

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

3 Aaron Sep 18 2020 at 02:59

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