Einer der grundlegenden Tasks in einem Skript für die Stapelverarbeitung besteht im Katalogisieren der verfügbaren Daten, sodass die Daten während der Verarbeitung durchlaufen werden können. ArcPy verfügt über eine Reihe von Funktionen, mit denen solche Listen erstellt werden können.
ListFields(dataset, wild_card, field_type) | Gibt eine Liste von Feldern zurück, die im Eingabewert gefunden wurden. |
ListIndexes(dataset, wild_card) | Gibt eine Liste von Attributindizes zurück, die im Eingabewert gefunden wurden. |
ListDatasets(wild_card, feature_type) | Gibt die Datasets im aktuellen Workspace zurück. |
ListFeatureClasses(wild_card, feature_type, feature_dataset) | Gibt die Feature-Classes im aktuellen Workspace zurück. |
ListFiles(wild_card) | Gibt die Dateien im aktuellen Workspace zurück. |
ListRasters(wild_card, raster_type) | Gibt eine Liste von Rastern zurück, die im aktuellen Workspace gefunden wurden. |
ListTables(wild_card, table_type) | Gibt eine Liste von Tabellen zurück, die im aktuellen Workspace gefunden wurden. |
ListWorkspaces(wild_card, workspace_type) | Gibt eine Liste von Workspaces zurück, die im aktuellen Workspace gefunden wurden. |
ListVersions(sde_workspace) | Gibt eine Liste von Versionen zurück, für die der verbundene Benutzer eine Verwendungsberechtigung hat. |
Das Ergebnis jeder dieser Funktionen ist eine Liste, das heißt eine Liste mit Werten. Eine Liste kann jeden Datentyp enthalten, wie etwa Zeichenfolgen. Dabei kann es sich beispielsweise um einen Pfad zu einem Dataset, um ein Feld oder um eine Zeile aus einer Tabelle handeln. Nachdem die Liste mit den gewünschten Werten erstellt wurde, können Sie diese im Skript in einer Schleife durchlaufen und mit den einzelnen Werten arbeiten.
Listenfunktionsparameter
Die Parameter dieser Funktionen sind ähnlich. Einige, z. B. ListFields, erfordern einen Wert für ein Eingabe-Dataset, da sich die von diesen Funktionen aufgelisteten Elemente in einem bestimmten Objekt bzw. Dataset befinden. Andere Funktionen erfordern kein Eingabe-Dataset, da sie Daten im aktuellen Workspace auflisten, die in den Umgebungseinstellungen definiert sind. Alle Funktionen verfügen über einen Platzhalter-Parameter, mit dem die aufgelisteten Objekte bzw. Datasets nach Namen eingeschränkt werden können. Ein Platzhalter definiert einen Namensfilter, und der gesamte Inhalt in der neu erstellten Liste muss diesem Filter entsprechen. Sie können beispielsweise alle Feature-Classes in einem Workspace auflisten, die mit dem Buchstaben G beginnen. Dies wird im folgenden Beispiel veranschaulicht:
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*")
Die Liste kann auch so eingeschränkt werden, dass nach bestimmten Dateneigenschaften gesucht wird, beispielsweise nur nach Polygon-Feature-Classes, Ganzzahlfeldern oder Coverage-Datasets. Hierfür wird in allen Funktionen der Typparameter verwendet. Im nächsten Beispiel werden die Feature-Classes in einem Workspace mit einem Platzhalter und einem Datentyp gefiltert, sodass sich in der zurückgegebenen Liste nur Polygon-Feature-Classes befinden, die mit dem Buchstaben G beginnen:
# 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")
Verwenden von Listen
ArcPy verwendet einen Python-Listentyp für die Ergebnisse aller seiner Auflistungsfunktionen, da Listen die nötige Flexibilität für den Zugriff auf Daten und mehrere Datentypen bieten. Eine for-Schleife eignet sich optimal für die Arbeit mit Listen, da mit dieser Schleife Listen schrittweise durchlaufen werden können. Die for-Schleife durchläuft wiederholt jedes Element in der Liste. Das folgende Beispiel zeigt eine for-Schleife, mit der die im vorherigen Beispiel erzeugte Liste wiederholt durchlaufen wird:
# 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)
Im Folgenden finden Sie ein weiteres Beispiel für die Verwendung einer ArcPy-Auflistungsfunktion. Mit dem Skript werden Raster-Pyramiden für alle Raster erstellt, bei denen es sich um TIFF-Bilder (Tagged Image File Format) in einem Ordner handelt.
# 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)
Listen geben Ihnen die Möglichkeit, die Ergebnisse einer Auflistungsfunktion auf verschiedene Weise zu verwenden und zu verwalten. Listen sind ein vielseitiger Python-Typ. Sie stellen eine Reihe von Methoden (append, count, extend, index, insert, pop, remove, reverse und sort) bereit, mit denen Daten bearbeitet und extrahiert werden können.
Wenn Sie etwa wissen möchten, wie viele Feature-Classes in einem Workspace enthalten sind, können Sie diese Zahl mit der integrierten len-Funktion abrufen.
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)
Suchen von Verzeichnissen und Unterverzeichnissen
Mit ArcPy-Listenfunktionen können einzelne Verzeichnisse oder Workspaces durchlaufen werden. In einigen Fällen ist es jedoch notwendig, andere Unterordner und Workspaces zu durchlaufen. Für Dateien kann dies mit der Python-Funktion os.walk ausgeführt werden, die bei der Suche nach zusätzlichen Unterordnern oder Dateien zum Durchlaufen von Ordnern verwendet wird. os.walk ist jedoch streng dateibasiert und erkennt keine Datenbanken und nicht dateibasierten Datentypen, die in ArcGIS wichtig sind. Beispielsweise erkennt os.walk keine Raster-Datasets oder andere Inhalte in einem File-Geodatabase-Workspace oder in einem Feature-Dataset.
Im arcpy.da-Modul kann die Funktion Walk auch zum Durchlaufen eines Verzeichnisses verwendet werden und um Datenbanken zu durchsuchen und ArcGIS-Datentypen zu identifizieren.
Walk(top, topdown, onerror, followlinks, datatype, type) | Erstellt Datennamen in einem Kataloginhaltsverzeichnis, indem die Struktur von oben nach unten oder von unten nach oben durchlaufen wird. Jedes/jeder Verzeichnis/Workspace in der Struktur ergibt einen Dreier-Tupel (dirpath, dirnames, filenames). |
Im folgenden Beispiel wird die Funktion Walk verwendet, um ein Kataloginhaltsverzeichnis zu durchlaufen und alle darin enthaltenen Polygon-Feature-Classes zu identifizieren.
Verwenden Sie die Funktion "Walk" zum Katalogisieren von Polygon-Feature-Classes.
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))
In einigen Fällen gibt es Unterverzeichnisse, die beim Durchlaufen des Katalogverzeichnisses vermieden werden sollten, beispielsweise Verzeichnisse von gesicherten Dateien. Wenn das Argument topdown auf True gesetzt oder nicht angegeben ist, können die Workspaces direkt geändert werden, um unerwünschte Workspaces zu vermeiden oder zusätzliche Workspaces beim Erstellen hinzuzufügen.
Verwenden Sie die Funktion "Walk" zum Katalogisieren von Raster-Daten. Jedes Raster im Ordner namens back_up wird ignoriert.
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))
Beispiel: Verwenden von "arcpy.da.Walk" zum Analysieren von Daten
Die Funktion Walk (ebenso wie Listenfunktionen) werden häufig zum Verarbeiten von Daten in einer Massenoperation verwendet. Im folgenden Skript wird die Funktion arcpy.da.Walk zum Analysieren sämtlicher Datasets in einem SDE-Workspace verwendet.
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")