arcpy.CalculateField_managementの式

Oct 05 2020

私はツールセットに取り組んでおり、入力の1つはシェープファイルのフィールドです。フィールドを定義し、それを複数の関数で使用しましたが、エラーなしで機能しています。

問題は、CalculateFieldの式でフィールドを使用したい場合、定義されたフィールドを認識しないが、フィールドの名前(属性テーブルの名前)を使用すると機能することです。

式部分のコードを書くのを間違えたと思います。

import os, sys    
import arcpy
from arcpy import env
from arcpy.sa import *
arcpy.CheckOutExtension("Spatial")
    
###### Define variables
shapes = sys.argv[1]
outputfolder = sys.argv[2]
outputname = sys.argv[3]
field = sys.argv[4]
output = os.path.join(outputfolder,outputname)
arcpy.AddMessage(shapes)
arcpy.AddMessage(field)
arcpy.AddMessage(output)
    
shapes1=arcpy.AddField_management(shapes,'Classific','TEXT')
shapes2=arcpy.CalculateField_management(shapes1,'Classific',"!Classific!.replace(!Classific!,field)", 'PYTHON3')
    
Unionfield = arcpy.CalculateField_management(Unionfield, field, "field+ !FIRST_Clas!", 'PYTHON3')
Unionfield = arcpy.CalculateField_management(Unionfield, field, "!Class!+ !FIRST_Clas!", 'PYTHON3')

また、実行するたびにツールセットの出力をコンテンツに追加することについて、別の質問があります。

ツールセットを毎回実行すると、outputfolderから出力をインポートする必要があるたびに、出力がコンテンツに表示されません。

回答

7 Hornbydd Oct 05 2020 at 00:33

あなたは、あなたが呼ばれる変数を埋め込むている、基本的なミスを犯してきたfield直接の中にそれはない変数として、いくつかのテキストとしてそれを見ているので、「」内のテキスト式、すなわち。

このようなことをします:

expression = "!Classific!.replace(!Classific!,'" + field + "')"
shapes2=arcpy.CalculateField_management(shapes1,'Classific',expression, 'PYTHON3')

補足として:shapes1、shapes2およびunionfieldはRESULTオブジェクトであり、ツールの実行結果です。resObj現時点では、コードが何を表しているのか完全に誤解を招く可能性があるため、コードを理解するのに役立つので、それらを次のように呼ぶことをお勧めします。

4 radouxju Oct 05 2020 at 03:17

テキスト文字列で変数の値を使用するには、を使用することをお勧めします.format()。

実際には、間に欠落しているパラメーターを含む文字列を記述してから{}、すべてのパラメーターをformat関数(で区切る,)にリストします。

arcpy.AddField_management(shapes,'Classific','TEXT')
arcpy.CalculateField_management(shapes,'Classific',"!Classific!.replace(!Classific!,!{0}!)".format(field), 'PYTHON3')

その場合、フィールド名をの間に追加することを忘れないでください!!。そうしないと、使用されるフィールドに含まれる値ではなく、その名前になります(すべての行のフィールド名をコピーする必要はないと思います)。 。

そうは言っても、新しいフィールドに別のフィールドの値を入力するのに、複雑なreplaceステートメントは必要ありません。あなたが使用することができます:

arcpy.CalculateField_management(shapes,'Classific',"!{}!".format(field), 'PYTHON3')

2番目の例にも同じ方法を適用できます(フィールドは同じタイプである必要があることに注意してください)。

arcpy.CalculateField_management(shapes,field,"!{}! + !First_class! ".format(field), 'PYTHON3')