Crear listas de datos
Una de las tareas principales en una secuencia de comandos de procesamiento por lotes es catalogar los datos disponibles de modo que se pueda recorrer en iteración los datos durante el procesamiento. ArcPy tiene varias funciones diseñadas específicamente para la creación de estas listas.
ListFields(dataset, wild_card, field_type) |
Devuelve una lista de los campos que se encuentran en el valor de entrada |
ListIndexes(dataset, wild_card) |
Devuelve una lista de los índices de atributos que se encuentran en el valor de entrada |
ListDatasets(wild_card, feature_type) |
Devuelve los datasets en el espacio de trabajo actual |
ListFeatureClasses(wild_card, feature_type, feature_dataset) |
Devuelve las clases de entidades en el espacio de trabajo actual |
ListFiles(wild_card) |
Devuelve los archivos en el espacio de trabajo actual |
ListRasters(wild_card, raster_type) |
Devuelve una lista de los rásteres que se encuentran en el espacio de trabajo actual |
ListTables(wild_card, table_type) |
Devuelve una lista de las tablas que se encuentran en el espacio de trabajo actual |
ListWorkspaces(wild_card, workspace_type) |
Devuelve una lista de los espacios de trabajo que se encuentran en el espacio de trabajo actual |
ListVersions(sde_workspace) |
Devuelve una lista de las versiones que el usuario que está conectado tiene permiso de utilizar |
El resultado de cada una de estas funciones es una lista, que es una lista de los valores. Una lista en la secuencia de comandos puede contener cualquier tipo de datos, tales como una cadena de caracteres, que puede ser, por ejemplo, una ruta hacia un dataset, un campo o una fila de una tabla. Una vez que se creó la lista con los valores que desea, puede incluirla en un bucle en la secuencia de comandos para trabajar con cada valor individual.
Parámetros de funciones de lista
Los parámetros de estas funciones son similares. Algunos, tales como ListFields, requieren un valor de dataset de entrada, ya que los elementos que las funciones enumeran residen dentro de un determinado objeto o dataset. Otras funciones no requieren un dataset de entrada, ya que enumeran tipos de datos en el espacio de trabajo actual que están definidos en la configuración del entorno. Todas las funciones tienen un parámetro comodín, que se utiliza para restringir los objetos o datasets que se enumeran por nombre. Un comodín define un filtro de nombre y todo el contenido en la lista que se creó recientemente debe pasar por ese filtro. Por ejemplo, es posible que desee enumerar todas las clases de entidades en un espacio de trabajo que comiencen con la letra G. El siguiente ejemplo muestra cómo realizar esta tarea:
import arcpy
# Set the workspace. List all of the feature classes that start with 'G'
#
arcpy.env.workspace = "D:/St_Johns/data.gdb"
fcs = arcpy.ListFeatureClasses("G*")
La lista también se puede restringir para que coincida con ciertas propiedades de datos, tales como solamente clases de entidades poligonales, campos enteros o datasets de cobertura. Para esto se utiliza el parámetro de tipo en todas las funciones. En el siguiente ejemplo, las clases de entidades en un espacio de trabajo se filtran con un comodín y un tipo de datos, de modo que solamente las clases de entidades poligonales que comienzan con la letra G se incluyen en la lista resultante:
# Set the workspace. List all of the polygon feature classes that
# start with 'G'
#
arcpy.env.workspace = "D:/St_Johns/data.gdb"
fcs = arcpy.ListFeatureClasses("G*", "polygon")
Utilizar su lista
ArcPy utiliza un tipo de lista de Python como el tipo que se devolvió para todos los resultados de las funciones de lista, ya que las listas admiten la flexibilidad que se requiere para el acceso de datos y varios tipos de datos. Un bucle for es ideal para trabajar con una lista ya que se puede utilizar para recorrer la lista de un elemento por vez. Un bucle for recorre en iteración todos los elementos de la lista. A continuación hay un ejemplo de un bucle for utilizado para recorrer en iteración la lista que se generó en el ejemplo anterior:
# For each feature class in the list of feature classes
#
for fc in fcs:
# Copy the features from the workspace to a folder
#
arcpy.CopyFeatures_management(fc, "D:/St_Johns/Shapefiles/" + fc)
A continuación hay otro ejemplo de cómo utilizar una función de lista de ArcPy. La secuencia de comandos se utiliza para crear pirámides de ráster para todos los rásteres que son imágenes de Formato de archivo de imagen etiquetado (TIFF) dentro de una carpeta.
# Set the workspace. List all of the TIFF files
#
arcpy.env.workspace= "D:/St_Johns/images"
# For each raster in the list of rasters
#
for tiff in arcpy.ListRasters("*", "TIF"):
# Create pyramids
#
arcpy.BuildPyramids_management(tiff)
Una lista ofrece la oportunidad de utilizar y administrar los resultados de una función de lista en una variedad de formas. Las listas son un tipo de Python versátil y proporcionan varios métodos (adjuntar, contar, extender, indexar, insertar, emerger, quitar, invertir y ordenar) que se pueden utilizar para manipular y extraer información.
Por ejemplo, si desea saber cuántas clases de entidades tiene en un espacio de trabajo, puede utilizar una función len integrada de Python para proporcionar esa cantidad.
import arcpy
arcpy.env.workspace = "c:/St_Johns/Shapefiles"
fcs = arcpy.ListFeatureClasses()
# Use Python's built-in function len to reveal the number of feature classes
# in the workspace
#
fcCount = len(fcs)
print fcCount
Una lista puede mostrar su contenido fácilmente. Las listas se pueden manipular con varios métodos, incluidos ordenar, adjuntar e invertir.
>>> import arcpy
>>> arcpy.env.workspace = "c:/data/water.gdb"
>>> fcs = arcpy.ListFeatureClasses()
>>> print fcs
[u'water_pipes', u'water_services', u'water_stations']
>>> fcs.sort(reverse=True)
>>> print fcs
[u'water_stations', u'water_services', u'water_pipes']
Debido a que las listas son un conjunto ordenado, también permiten indexar y segmentar.
>>> print fcs[0]
water_stations
>>> print fcs[1:]
[u'water_services', u'water_pipes']
Buscar directorios y subdirectorios
Las funciones de lista de ArcPy se pueden usar para iterar un solo directorio o espacio de trabajo, pero en ciertos casos, es necesario iterar a través de otras subcarpetas y espacios de trabajo. En los archivos, esto se puede lograr con la función os.walk de Python, que se usa para iterar o desplazarse por carpetas para encontrar subcarpetas y archivos adicionales. Sin embargo, os.walk se basa estrictamente en archivos y no reconoce bases de datos ni tipos de datos que no estén basados en archivos importantes en ArcGIS. Por ejemplo, os.walk no verá datasets ráster ni otros contenidos en un espacio de trabajo de geodatabase de archivos o un dataset de entidades.
En el módulo arcpy.da, la función Caminar se puede utilizar para iterar en un directorio y se puede utilizar también para buscar en bases de datos e identificar los tipos de datos ArcGIS.
Walk(top, topdown, onerror, followlinks, datatype, type) |
Genere nombres de datos en un árbol de catálogo recorriendo el árbol de arriba abajo o de abajo arriba. Cada directorio o espacio de trabajo del árbol genera una tupla de tres (ruta de directorio, nombres de directorio y nombres de archivo). |
A diferencia de las funciones de lista, Walk no usa el entorno del espacio de trabajo para identificar el espacio de trabajo de inicio. En lugar de eso, el primer espacio de trabajo de inicio (o superior) que Walk atraviese se especifica en su primer argumento, top.
En el siguiente ejemplo, la función Walk se utiliza para iterar en un árbol de catálogo e identificar todas las clases de entidad poligonal que contenga.
Use la función Caminar para catalogar clases de entidad poligonal.
import arcpy
import os
workspace = "c:/data"
feature_classes = []
for dirpath, dirnames, datatypes in arcpy.da.Walk(workspace,
datatype="FeatureClass",
type="Polygon"):
# Append all Polygon feature classes to a list for further processing
for datatype in datatypes:
feature_classes.append(os.path.join(dirpath, filename))
En ciertos casos, puede haber subdirectorios que haya que evitar al atravesar el árbol de catálogo, como por ejemplo, directorios de archivos con copia de seguridad. Si el argumento topdown está definido como True (verdadero) o no está especificado, los espacios de trabajo se pueden modificar in situ para evitar espacios de trabajo no deseados o agregar espacios de trabajo adicionales a medida que se creen.
Use la función Caminar para catalogar datos de ráster. Se omitirán todos los rásteres de una carpeta llamada back_up.
import arcpy
import os
workspace = "c:/data"
rasters = []
for dirpath, dirnames, filenames in arcpy.da.Walk(workspace,
topdown=True,
datatype="RasterDataset"):
# Disregard any folder named 'back_up' in creating list
# of rasters
if "back_up" in dirnames:
dirnames.remove('back_up')
for filename in filenames:
rasters.append(os.path.join(dirpath, filename))
Ejemplo: usar arcpy.da.Walk para analizar datos
La función Walk (al igual que las funciones de lista) se utiliza comúnmente para procesar datos en volumen. La siguiente secuencia de comandos aprovecha la función arcpy.da.Walk para analizar todos los datasets en un espacio de trabajo de SDE.
import arcpy
import os
# SDE workspace to be used
admin_workspace = "Database Connections/tenone@sde.sde"
analyze_contents = []
for dirpath, workspaces, datatypes in arcpy.da.Walk(
admin_workspace,
followlinks=True,
datatype=['Table', 'FeatureClass', 'RasterDataset']):
# Create full path, and add tables, feature classes, raster datasets
analyze_contents += [
os.path.join(dirpath, datatype) for datatype in datatypes]
# create full path, add the feature datasets of the .sde file
analyze_contents += [
os.path.join(dirpath, workspace) for workspace in workspaces]
# Execute Analyze Datasets on the complete list
arcpy.AnalyzeDatasets_management(admin_workspace,
"SYSTEM",
analyze_contents,
"ANALYZE_BASE",
"ANALYZE_DELTA",
"ANALYZE_ARCHIVE")
De forma predeterminada, los archivos de conexión sde no se iteran para evitar que las bases de datos remotas se abran accidentalmente. Para iterar intencionadamente por un archivo de conexión sde, defina el argumento followlinks como True.