Datenlisten erstellen
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) |
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 Python-Liste, das heißt eine Liste mit Werten. Eine Liste in Skripten 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 Typen von 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 einfachen Zugriff auf Daten und mehrere Datentypen bieten. Eine for-Schleife eignet sich optimal für die Arbeit mit Python-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 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)
Python-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 Python-Funktion len 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
Eine Python-Liste kann den Inhalt leicht anzeigen. Python-Listen können mit einer Reihe von Methoden bearbeitet werden (einschließlich sort, append, reverse).
>>> 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']
Da Listen eine geordnete Sammlung sind, erlauben sie auch Indizierung und Aufteilung.
>>> print fcs[0]
water_stations
>>> print fcs[1:]
[u'water_services', u'water_pipes']
Listenfunktions-Typschlüsselwörter
Das Standardverhalten für alle Auflistungsfunktionen besteht darin, dass alle unterstützten Typen aufgelistet werden. Mit einem Schlüsselwort wird die zurückgegebene Liste auf einen bestimmten Typ beschränkt. Die Typschlüsselwörter für die einzelnen Funktionen sind in der folgenden Tabelle aufgeführt.
Funktion |
Schlüsselwörter für Datentypen |
---|---|
ListDatasets |
All, Feature, Coverage, RasterCatalog, CAD, VPF, TIN, Topology |
ListFeatureClasses |
All, Point, Label, Node, Line, Arc, Route, Polygon, Region |
ListFields |
All, SmallInteger, Integer, Single, Double, String, Date, OID, Geometry, BLOB |
ListTables |
All, dBASE, INFO |
ListRasters |
All, ADRG, BIL, BIP, BSQ, BMP, CADRG, CIB, ERS, GIF, GIS, GRID, STACK, IMG, JPEG, LAN, SID, SDE, TIFF, RAW, PNG, NITF |
ListWorkspaces |
All, Coverage, Access, SDE, Folder |
Suchen von Verzeichnissen und Unterverzeichnissen
Mit ArcPy-Listenfunktionen können ein 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 Gehen auch zum Durchlaufen eines Verzeichnisbaums verwendet werden, sie kann jedoch auch Datenbanken durchsuchen und ArcGIS-Datentypen identifizieren.
Gehen(top, topdown, onerror, followlinks, datatype, type) |
Erstellen Sie Datennamen in einem Katalogverzeichnis, indem Sie die Struktur von oben nach unten oder von unten nach oben durchlaufen. Jedes/jeder Verzeichnis/Workspace in der Struktur ergibt einen Dreier-Tupel (dirpath, dirnames, filenames). |
Im Gegensatz zu Listenfunktionen verwendet "Gehen" nicht die Workspace-Umgebung, um den Start-Workspace zu identifizieren. Stattdessen wird der erste (oder oberste) Start-Workspace, der mit "Gehen" durchlaufen wird, im ersten Argument top angegeben.
Im folgenden Beispiel wird die Funktion "Gehen" verwendet, um ein Katalogverzeichnis zu durchlaufen und alle darin enthaltenen Polygon-Feature-Classes zu identifizieren.
Verwenden Sie die Funktion "Gehen" 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 "Gehen" 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 "Gehen" (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")
Die SDE-Verbindungsdateien werden standardmäßig nicht durchlaufen, um sie vor unbeabsichtigtem Öffnen von Remote-Datenbanken zu schützen. Um eine SDE-Verbindungsdatei bewusst zu durchlaufen, legen Sie das Argument followlinks auf True fest.