arcpy.CalculateField_management의 표현식
나는 도구 세트를 작업 중이며 입력 중 하나는 shapefile의 필드입니다. 필드를 정의하고 여러 기능에서 사용했으며 오류없이 작동합니다.
문제는 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에서 출력을 가져와야 할 때마다 출력이 내용에 나타나지 않습니다.
답변
당신은 당신이라는 변수를 포함 한 기본적인 실수를 한 field직접 내에서 가 아닌 변수로 텍스트로 볼 수 있도록 ""내 텍스트 표현, 즉.
다음과 같이하십시오.
expression = "!Classific!.replace(!Classific!,'" + field + "')"
shapes2=arcpy.CalculateField_management(shapes1,'Classific',expression, 'PYTHON3')
사이드 참고로 : shapes1, shapes2및 unionfield결과 개체 공구 실행의 결과이다. resObj코드가 무엇을 나타내는 지에 대해 완전히 오해의 소지가있는 순간에 코드를 이해하는 데 도움이 될 것이므로 다음과 같이 호출하는 것이 좋습니다 .
텍스트 문자열에서 변수의 값을 사용하려면 .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')
두 번째 예제에 동일한 방법을 적용 할 수 있습니다 (필드 유형이 동일해야 함).
arcpy.CalculateField_management(shapes,field,"!{}! + !First_class! ".format(field), 'PYTHON3')