データ リストの作成
バッチ処理スクリプトにおいて最も重要なタスクの 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 from arcpy import env # Set the workspace. List all of the feature classes that start with 'G' # 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' # env.workspace = "D:/St_Johns/data.gdb" fcs = arcpy.ListFeatureClasses("G*", "polygon")
List の使用
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 # 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 from arcpy import env 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 >>> from arcpy import env >>> 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 |
例:List 関数を使用したパーソナル ジオデータベースからファイル ジオデータベースへの移行
一般的な変換タスクの 1 つは、大量のデータを別の形式に変換することです。次のスクリプトは、ListWorkspaces、ListFeatureClasses、ListTables、ListDatasets を利用して、フォルダに含まれているパーソナル ジオデータベースをすべて特定し、それらに含まれているフィーチャ データセット、フィーチャクラス、テーブルをファイル ジオデータベースに変換します。
import arcpy from arcpy import env import os # Allow for the overwriting of file geodatabases, if they already exist # env.overwriteOutput = True # Set workspace to folder containing personal geodatabases # env.workspace = arcpy.GetParameterAsText(0) # Identify personal geodatabases # for pgdb in arcpy.ListWorkspaces("", "Access"): # Set workspace to current personal geodatabase # env.workspace = pgdb # Create file geodatabase based on personal geodatabase # fgdb = pgdb[:-4] + ".gdb" arcpy.CreateFileGDB_management(os.path.dirname(fgdb), os.path.basename(fgdb)) # Identify feature classes and copy to file gdb # for fc in arcpy.ListFeatureClasses(): print "Copying feature class " + fc + " to " + fgdb arcpy.Copy_management(fc, fgdb + os.sep + fc) # Identify tables and copy to file gdb # for table in arcpy.ListTables(): print "Copying table " + table + " to " + fgdb arcpy.Copy_management(table, fgdb + os.sep + table) # Identify datasets and copy to file gdb # Copy will include contents of datasets # for dataset in arcpy.ListDatasets(): print "Copying dataset " + dataset + " to " + fgdb arcpy.Copy_management(dataset, fgdb + os.sep + dataset)