Python スクリプトの新規作成
Python コードを保存するには、Python ファイル(*.py)を作成します。このファイルは ASCII ファイルで、Python ステートメントを格納します。以下の手順では、「Python スクリプトの作成」の説明に従って PythonWin アプリケーションを使用することを想定しています。
- PythonWin で [File] メニューをクリックし、[New] をクリックします。デフォルト オプションである [Python Script] をそのまま使用し、[OK] をクリックします。
- [Script1] ウィンドウの [Maximize] ボタンをクリックします。
- [File] メニューをクリックし、[Save As] をクリックします。スクリプトに multi_clip.py という名前を付けて、任意のフォルダに保存します。
- スクリプトの最初に、次の行を追加します。
- 処理するフィーチャクラスのセットを定義する入力ワークスペース
- [クリップ(Clip)] ツールによって入力フィーチャクラスからクリップされる領域として使用されるフィーチャクラス
- [クリップ(Clip)] ツールの結果が書き込まれる出力ワークスペース
- [クリップ(Clip)] ツールで使用される XY 許容値
[クリップ(Clip)] の機能の詳細については、[解析] ツールボックスの [クリップ(Clip)] ツールをご参照ください。
- 次のコードをスクリプトに追加して、実行時にスクリプトに渡されるユーザ定義の値に基づいて変数を定義および設定します。
- 次に示すエラー処理ステートメントおよび ArcPy の ListFeatureClasses() 関数をスクリプト ウィンドウに追加します。
- 次のコードを追加します。
- 次の行を追加してスクリプトを完成させます。
- スクリプトの最初に、次のコメントを追加します。
- PythonWin のツールバーにある [Save] ボタンをクリックして、スクリプトを保存します。
[Script1] ウィンドウが表示されます。「Script1」は、作成するスクリプトのデフォルト名です。
# Import ArcPy site-package and os modules # import arcpy import os
これで ArcPy サイトパッケージとオペレーティング システム モジュール os がスクリプトにインポートされます。os モジュールを使用すると、オペレーティング システムの最も基本的なツールに簡単にアクセスすることができます。このスクリプトでは、os モジュールのファイル名操作メソッドをいくつか使用します。
このスクリプトは、以下の 4 つの引数を持つため、汎用的に使用することができます。
# Set the input workspace # arcpy.env.workspace = arcpy.GetParameterAsText(0) # Set the clip featureclass # clipFeatures = arcpy.GetParameterAsText(1) # Set the output workspace # outWorkspace = arcpy.GetParameterAsText(2) # Set the XY tolerance # clusterTolerance = arcpy.GetParameterAsText(3)
try: # Get a list of the featureclasses in the input folder # fcs = arcpy.ListFeatureClasses()
Python では、この言語の構造として、特定のステートメントの後のコードが強制的にインデントされます。try ステートメントは、関連付けられた例外ハンドラである except ステートメントで処理されるコード ブロックの始まりを定義します。このブロック内のすべてのコードをインデントする必要があります。Python では try/except ブロックを使用して、実行中の予期しないエラーを処理します。例外ハンドラは、システムまたはスクリプト自体によって例外が発生したときに、プログラムで行うべき措置を定義します。すべてのスクリプトでジオプロセッサによるエラー処理を使用して、エラー メッセージをユーザに伝達できるようにしておくことをお勧めします。これにより、単にシステム エラーを発生させるのではなく、スクリプトを穏やかに終了して有益なメッセージを返すことが可能になります。
ListFeatureClasses() は、現在のワークスペースにあるフィーチャクラス名の Python リストを返します。ワークスペースは、使用するデータの場所と、絶対パスが指定されない場合にすべての新しいデータを作成する場所を定義します。ワークスペースは、すでに 1 つ目の引数の値に設定されています。Python リストは汎用的なオブジェクトです。リストに含まれている各フィーチャクラスを確認するには、for ループを使用します。
for fc in fcs: # Validate the new feature class name for the output workspace. # featureClassName = arcpy.ValidateTableName(fc, outWorkspace) outFeatureClass = os.path.join(outWorkspace, featureClassName) # Clip each feature class in the list with the clip feature class. # Do not clip the clipFeatures, it may be in the same workspace. # if fc <> os.path.basename(clipFeatures): arcpy.Clip_analysis(fc, clipFeatures, outFeatureClass, clusterTolerance)
リストの最後の名前に達すると、for ループは終了します。ValidateTableName() 関数は、出力名が出力ワークスペースに有効であることを確認するために使用します。ピリオドやダッシュなど、一部の文字はジオデータベースでは許可されないため、このメソッドでは無効な文字を有効な文字で置き換えた名前が返されます。一意の名前が返されるため、既存のデータが上書きされることはありません。
os.path の basename メソッドは、クリップ フィーチャクラスのパスを操作するために使用されます。したがって、式ではパス全体ではなく、フィーチャクラスの名前のみが評価されます。[クリップ(Clip)] ツールには ArcPy 関数として、各種の文字列変数をパラメータ値に使用してアクセスします。
except: arcpy.AddMessage(arcpy.GetMessages(2)) print arcpy.GetMessages(2)
except ステートメントは、先述の try ステートメントに必要です。使用しない場合は構文エラーになります。実行中にエラーが発生した場合は、except ブロック内のコードが実行されます。スクリプトをスクリプト ツールから実行した場合は、重要度 2(エラーを示す)のすべてのメッセージが追加されます。スクリプトがツールの外部で実行された場合は、すべてのエラー メッセージが標準出力にも出力されます。
# Script Name: Clip Multiple Feature Classes # Description: Clips one or more shapefiles # from a folder and places the clipped # feature classes into a geodatabase. # Created By: Insert name here. # Date: Insert date here.
完成した上記のスクリプトは、「Python の実行とデバッグ」および「Python を使用したブレークポイントの設定」での Python の使用方法の説明で使用します。
変数に名前を付けるときは、Python では大文字と小文字が区別されることに注意してください。つまり、clipFeatures と ClipFeatures は同じではありません。
GetParameterAsText() は、引数を取得するために使用します。定義済みのデータセット名とパラメータ値をスクリプトで使用する場合は、GetParameterAsText() 関数の使用が不要になることもあります。
コロンで終わるステートメントは、インデントされたコードが始まることを意味します。Python ではコード ブロックの最初や最後を示すための中括弧、角括弧、セミコロンは使用しません。代わりにブロックをインデントして、その境界を示します。これにより、読み書きしやすいコードになります。
完成したスクリプトは次のようになります。
# Script Name: Clip Multiple Feature Classes # Description: Clips one or more shapefiles # from a folder and places the clipped # feature classes into a geodatabase. # Created By: Insert name here. # Date: Insert date here. # Import ArcPy site-package and os modules # import arcpy import os # Set the input workspace # arcpy.env.workspace = arcpy.GetParameterAsText(0) # Set the clip featureclass # clipFeatures = arcpy.GetParameterAsText(1) # Set the output workspace # outWorkspace = arcpy.GetParameterAsText(2) # Set the XY tolerance # clusterTolerance = arcpy.GetParameterAsText(3) try: # Get a list of the featureclasses in the input folder # fcs = arcpy.ListFeatureClasses() for fc in fcs: # Validate the new feature class name for the output workspace. # featureClassName = arcpy.ValidateTableName(fc, outWorkspace) outFeatureClass = os.path.join(outWorkspace, featureClassName) # Clip each feature class in the list with the clip feature class. # Do not clip the clipFeatures, it may be in the same workspace. # if fc <> os.path.basename(clipFeatures): arcpy.Clip_analysis(fc, clipFeatures, outFeatureClass, clusterTolerance) except: arcpy.AddMessage(arcpy.GetMessages(2)) print arcpy.GetMessages(2)