データのリストの作成
バッチ処理スクリプトにおいて最も重要なタスクの 1 つは、利用可能なデータをカタログ化してまとめ、反復処理できるようにすることです。ArcPy には、このようなリストを作成するために特別に用意された関数がいくつかあります。
ListFields(dataset、wild_card、field_type) |
入力値に含まれるフィールドのリストを返します。 |
ListIndexes(dataset、wild_card) |
入力値に含まれる属性インデックスのリストを返します。 |
ListDatasets(wild_card、feature_type) |
現在のワークスペース内にあるデータセットを返します。 |
ListFeatureClasses(wild_card、feature_type) |
現在のワークスペース内にあるフィーチャクラスを返します。 |
ListFiles(wild_card) |
現在のワークスペース内にあるファイルを返します。 |
ListRasters(wild_card、raster_type) |
現在のワークスペースに含まれるラスタのリストを返します。 |
ListTables(wild_card、table_type) |
現在のワークスペースに含まれるテーブルのリストを返します。 |
ListWorkspaces(wild_card、workspace_type) |
現在のワークスペースに含まれるワークスペースのリストを返します。 |
ListVersions(sde_workspace) |
接続されているユーザが使用許可を持っているバージョンのリストを返します。 |
これらの関数それぞれの結果は Python リスト、つまり値のリストです。スクリプトで使用されるリストには、どのようなタイプのデータを含めることもできます。たとえば文字列を使用して、テーブルにあるデータセット、フィールド、または行のパスを指定できます。必要な値が含まれたリストが作成されたら、スクリプトでそのリストのループ処理を行い、個々の値を処理することができます。
リスト関数のパラメータ
これらの関数のパラメータは類似しています。ListFields などいくつかの関数には、入力データセット値を指定する必要があります。これらの関数は、リスト作成対象の項目が特定のオブジェクトまたはデータセット内にあるからです。その他の関数は、環境設定に定義されている現在のワークスペース内にある各種データのリストを作成するので、入力データセットの指定は必要ありません。すべての関数にワイルドカード パラメータがあり、これはリストに含めるオブジェクトまたはデータセットを名前で絞り込むために使用されます。ワイルドカードは名前フィルタを定義します。新しく作成されるリストの内容はすべて、このフィルタを通らなければなりません。たとえば、ワークスペース内のフィーチャクラスのうち、文字 G で始まるフィーチャクラスをすべて列挙したいとしましょう。次のコード例は、その方法を示しています。
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*")
リストは、ポリゴン フィーチャクラス、整数フィールド、カバレッジ データセットといった特定のデータ特性に一致するものだけに限定することもできます。Type パラメータは、すべての関数でこの用途に使用されます。次のコード例では、ワークスペース内のフィーチャクラスをワイルドカードとデータ タイプでフィルタリングし、文字 G で始まるポリゴン フィーチャクラスだけが結果のリストに含まれるようにします。
# 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")
リストの使用
ArcPy から返される、List 関数の実行結果のタイプは、すべて Python リスト タイプです。このリストを使用すれば、単純なデータ アクセスに必要な柔軟性と複数のデータ タイプがサポートされるからです。For ループは、一度にリストにあるひとつの項目について順次処理できるので、Python リストの処理に最適です。For ループは、リストのそれぞれの項目を反復処理します。次に、前記の例で生成されたリストを反復処理するために使用される For ループの例を示します。
# 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)
次に示すのは、List 関数の使用法を示すもう 1 つの例です。このスクリプトは、フォルダに含まれているラスタのうち、TIFF イメージであるラスタをすべて検索し、そのラスタ ピラミッドを作成します。
# 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 リストは、List 関数の結果をさまざまな方法で使用および管理するために便利です。リストは多用途の Python タイプで、情報の操作および抽出に使用できるさまざまなメソッド(append、count、extend、index、insert、pop、remove、reverse、sort)があります。
たとえば、ワークスペースに存在するフィーチャクラスの数を知りたい場合は、Python に組み込まれている len 関数を使用します。
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
Python リストの内容は簡単に表示できます。sort、append、reverse など、さまざまなメソッドを使用して Python リストを操作できます。
>>> 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']
リストは順序付きのコレクションなので、インデックス作成とスライスも可能です。
>>> print fcs[0]
water_stations
>>> print fcs[1:]
[u'water_services', u'water_pipes']
List 関数のタイプ キーワード
すべてのList 関数はデフォルトで、サポートされているすべてのタイプをリスト化します。返されるリストを特定のタイプに限定するには、キーワードを使用します。次の表に、各関数のタイプ キーワードを示します。
関数 |
タイプ キーワード |
---|---|
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 |
ディレクトリとサブディレクトリの検索
ArcPy List 関数は、単一のディレクトリまたはワークスペースを反復処理するために使用できますが、場合によっては、他のサブフォルダやワークスペースの反復処理が必要なこともあります。ファイルの場合、Python の os.walk 関数を使用して、フォルダを反復処理またはウォーク スルーし、別のサブフォルダとファイルを見つけることができます。ただし、os.walk は、ファイルベースであり、ArcGIS で重要であるデータベースやファイル以外のデータ タイプを認識しません。たとえば、os.walk は、ファイル ジオデータベース ワークスペースやフィーチャ データセットのラスタ データセットや他のコンテンツを認識しません。
arcpy.da モジュールでは、ディレクトリ ツリーの反復処理に Walk 関数も使用できますが、この関数はデータベースを調べ、ArcGIS データ タイプを識別することもできます。
Walk(top、topdown、onerror、followlinks、datatype、type) |
上から下または下から上にツリーを操作することによって、カタログ ツリーでデータ名を生成します。ツリーの各ディレクトリ/ワークスペースから、3 つ(dirpath、dirnames、filenames)の組み合わせが得られます。 |
Walk 関数は、List 関数とは異なり、開始ワークスペースを特定するのにワークスペース環境を使用しません。Walk が移動する最初の開始(トップ)ワークスペースは、最初の引数 top で指定されます。
以下の例では、Walk 関数を使用して、カタログ ツリーを反復処理し、内蔵されるすべてのポリゴン フィーチャクラスを特定します。
ポリゴン フィーチャクラスを分類する Walk 関数を使用します。
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))
場合によっては、カタログ ツリーを移動する際に回避すべきサブディレクトリ(バックアップ ファイルのディレクトリなど)があることがあります。topdown 引数が True であるまたは指定されていない場合、ワークスペースを変更して、不要なワークスペースを回避したり別のワークスペースを追加したりすることができます。
ラスタ データを分類する Walk 関数を使用します。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))
例: arcpy.da.Walk を使用したデータ解析
Walk 関数(List 関数も同様)は、一般にデータの一括処理に使用されます。以下のスクリプトは、arcpy.da.Walk 関数を利用して、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")
デフォルトでは、SDE 接続ファイルは、リモート データセットを意図せず開くことのないよう、反復処理されません。SDE 接続ファイルを意図的に反復処理するには、[followlinks] を [True] に設定します。