arcpy for / whileループでエラーをバイパスする方法は?


10

ワークスペースをループしてシェイプファイルの名前を変更し、フィーチャデータセットにコピーする便利なスクリプトツールがあります。ただし、ワークスペースのどこかに破損したシェープファイルがある場合、スクリプトは失敗し、処理が停止します。

このようなエラーをどのように処理しますか?エラーファイルを印刷し、forループの次のシェイプファイルの処理を続行して完了する方法はありますか?

import arcpy
from arcpy import env

# Allow overwriting of output  
env.overwriteOutput = True

# Parameters  
env.workspace = arcpy.GetParameterAsText(0) 
state = arcpy.GetParameterAsText(1)
gdb = arcpy.GetParameterAsText(2)

# Get a list of shapefiles in folder  
fcs = arcpy.ListFeatureClasses() 

# Find the total count of shapefiles in list  
fcCount = len(fcs) 

# Set the progressor 
arcpy.SetProgressor("step", "Copying shapefiles to geodatabase...", 0,fcCount, 1) 

# For each shapefile, copy to a file geodatabase

try:
    for shp in fcs: 


        # Define name for the output points 
        fc = str(state + shp[0:9])

        # Update the progressor label for current shapefile  
        arcpy.SetProgressorLabel("Loading " + shp + "...") 

        # Copy the data  
        arcpy.CopyFeatures_management(shp, str(gdb + "\\" + fc)) 

        # Update the progressor position  
        arcpy.SetProgressorPosition()

except Exception as e:
    print "An error has occurred"
    print e

arcpy.ResetProgressor()

回答:


15

「次にエラーが発生したpythonで再開」などのグーグルを試してください。これはStackOverflowからのこのヒットを含む多数のヒットを返します。

失敗する可能性のあるステートメントとその失敗方法がわかっている場合は、例外処理を使用して、次のセクションに進む前に、ステートメントの特定のブロックで発生する可能性のある問題を明確にクリーンアップできます。

1)try...except問題が発生すると思われる行の周りにブロックを配置するオプションがあります。つまり、CopyFeaturesツールです。

2)エラーに関するPythonリファレンス、特にセクション8.3 も参照してください。「e」への参照を取得すると、その例外タイプを判別し、必要に応じてそれを処理できる場合があります。

たとえば、このStackOverflowの質問には、あなたと同様のワークフローが含まれています。

for getter in (get_random_foo, get_random_bar):
    try:
        return getter()
    except IndexError:
        continue  # Ignore the exception and try the next type.

raise IndexError, "No foos, no bars"

あなたの場合、「IndexError」の代わりに、破損タイプのシェープファイルの例外タイプであると判断したものを使用します


1
また、exceptセクションのエラーリストにshp名を追加することもできます。あなたのIEを定義します。ErrLst = [] FORループの前、およびCONTINUEの前のexceptセクション行で、ErrLst.append(shp)を実行します。プログラムの最後にdo-- ErrLstのlの場合:print >> file.txt、l。これにより、リストがファイルに出力されます。私はそれをテストしませんでしたが、うまくいくはずです。
Tomek

Stephenに感謝します。try/ except-continueブロックでうまくいきます。
アーロン

7

Stephenが既に述べたように、CopyFeaturesツールを別の試みで囲むことができます...ブロックを除く。

ツールが特定のShapefileで失敗した場合、ツールメッセージをどこかに記録できます(私は常にSTDOUTに出力し、スクリプトを実行するときに出力をログファイルにパイプします)。

追加する必要があるのは、例外の横のExceptブロックで、ツール自体が生成したエラーメッセージを印刷する必要があることです。あなたは例外によって(確かにそうでなければならないので)ツールメッセージにアクセスできませんが、以下を呼び出すことによってarcpyオブジェクトからアクセスできます

arcpy.getmessages(messageCount - 1)

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//000v0000000m000000それを呼び出す方法と、特定のShapefileエラーに関連している可能性がある最後のメッセージを取得する方法を参照してください

これをログに記録した後、スクリプトに他のシェープファイルを継続させる

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.