ArcPy를 사용하여 필드 이름을 바꾸시겠습니까?


9

내가해야 할 일:

  1. 테이블 / 피처 클래스의 필드 이름 바꾸기
  2. 모든 값을 새 필드에 복사

지금까지 @ artwork21이 제안한대로 다음 코드를 수행했습니다.

import sys
import traceback
import arcpy
from arcpy import env

## ARGUMENTS
# argv[1] = input table/feature class path
# argv[2] = input old field name
# argv[3] = input new field name  

path = sys.argv[1]
oldFieldName = sys.argv[2] 
newFieldName = sys.argv[3] 

env.overwriteOutput = True

fields = arcpy.ListFields(path)
for field in fields:
    if field.aliasName == oldFieldName:
        if not oldFieldName == newFieldName:
            fieldType = field.type
            # Add new field
            arcpy.AddField_management(path, newFieldName, fieldType)
            #Calculates the new field based on old field values
            arcpy.CalculateField_management(path, newFieldName, "!"+oldFieldName+"!", "PYTHON", "")
            # Delete the old field (if necessary)
            arcpy.DeleteField_management(path, oldFieldName)

어떻게 매핑 할 수 있습니다 field.typeAddField_management방법의 필드 유형? 그리고 필드가 중간 위치에있는 동안 필드는 중간에서 삭제되어 마지막에 추가됩니다. 필드 이름이 바뀌는 것처럼 보이지 않습니다.

이 작업을 수행하는 데 도움이되는 더 나은 솔루션이 있습니까?


피처 레이어 필드의 이름은 fieldInfo.setNewName (index, "stat")로 바뀌지 않습니다. 이것이 row.setValue ( "stat", gValue) 행에 오류가 발생하는 이유입니다.
artwork21

2
setNewName (인덱스, new_field_name)은 기존 이름을 바꾸지 않고 새 필드 이름 만 설정해야합니다.
artwork21

2
FieldInfo 객체는 기본 데이터에 대해 아무 것도하지 않으며 단순히 FieldMappings 객체와 유사한 새 데이터를 만들기위한 특정 도구에 대한 입력으로 사용할 수있는 필드 속성을 나타냅니다.
blah238

1
old_field변수 이름 또는 기존 필드의 실제 이름은? 변수 이름 인 경우 문자열 형식 또는 연결을 사용하여 변수 값을 대괄호 (VB 파서) 또는 느낌표 (Python 파서)로 래핑해야합니다.
blah238

1
별명 일반적으로는 "별칭"또는이다 가명 . 데이터베이스의 실제 열 이름과 반드시 ​​같을 필요는 없습니다.
blah238

답변:


15

필드 추가, 필드 계산 및 필드 삭제 arcpy 도구의 조합을 사용하여이를 시도하십시오.

if fieldInfo.getFieldName(index) == "status":
    arcpy.AddField_management(layer, "stat", "TEXT", "", "", "50", "",        "NULLABLE", "NON_REQUIRED", "")                     
    arcpy.CalculateField_management(layer, "stat", "!status!", "PYTHON_9.3", "")
    arcpy.DeleteField_management(layer, "status")

1
두 필드 유형을 동일하게 만들고 싶습니다. 그러나 field.Type 및 AddField_management 메소드의 field_type 이름은 동일하지 않습니다. 무엇을해야합니까?
Emi

@ 에미, 나는 "두 필드 유형 동일"의 의미를 이해하지 못합니까? "status"의 값을 "stat"라는 새 필드에 넣기를 원하십니까?
artwork21

예, "status"의 값을 "stat"라는 새로운 필드에 넣기를 원합니다.
Emi

fieldInfo.addField ("status", "stat", "VISIBLE", "NONE")대신 시도 했다 fieldInfo.setNewName(index, "stat"). 그러나 내 코드에서 동일한 오류가 발생했습니다.
Emi

행의 경우 = arcpy.UpdateCursor (inputFeatureClass)이, 어쩌면 행을 시도 = arcpy.UpdateCursor (레이어)
artwork21

9

핵심 ArcGIS Desktop GP 도구- 필드 변경 (데이터 관리)을 사용하여 필드 이름을 바꿀 수 있습니다 . 이 도구는 지리 데이터베이스 테이블 또는 기능 클래스의 필드 이름을 바꾸거나 필드 별칭의 이름을 바꾸는 기능을 제공합니다.

이 도구는 10.2.1부터 사용할 수 있습니다 .


5
특정 데이터 형식 만 지원합니다. 특히, shapefile에 오류가 발생합니다.
jpmc26

3

테이블 또는 기능 클래스의 필드 이름을 바꾸려면 여기에 설명 된 절차를 시도해보십시오 .

  1. ArcMap을 시작하고 카탈로그 창을 엽니 다.
  2. 변경하려는 테이블이 포함 된 데이터베이스를 찾으십시오.
  3. 테이블을 마우스 오른쪽 단추로 클릭하고 특성을 클릭하십시오.
  4. 필드 탭을 클릭하십시오.
  5. 필드 이름 열에서 기존 텍스트를 클릭하고 새 이름을 입력하십시오.

방금 ArcGIS for Desktop Standard 10.1 SP1을 사용하여 파일 지오 데이터베이스 테이블에서 이것을 테스트했으며 정상적으로 작동했습니다.

불행히도,이 글을 작성한 후 What 's New in ArcGIS 10.1 PDF 파일을 검색 하여이 기능이 해당 버전에서 추가되었을 수 있음을 발견했습니다. 여전히 10.0의 최신 서비스 팩을 테스트하여 다시 이식되었는지 확인할 가치가 있습니다.


1
Emi가 아크 피 솔루션을 찾고 있다고 생각합니다.
artwork21

실제로 나는 arcpy 솔루션을 찾고 있습니다
Emi

1
내 실수 - 나는 @Emi 생각은 "이되는 것을 어느 [내 굵은] 더 나은 솔루션 ...".
PolyGeo

1

코드와 관련된 두 가지 큰 문제 :

  • dataType이 FeatureLayer가 아닌 경우 프로그램은 fieldinfo 조작을 건너 뛰고 값을 새로 만들거나 다시 명명되지 않은 필드로 설정하려고 시도합니다.

  • 두 줄 :

    gValue = row.getValue("status")

    row.setValue("stat", gValue)

    큰 문제가 있습니다. 이전 코드가 작동 한 경우 "상태"필드가 존재하지 않습니다.


코드를 확인하고 기능 레이어이며 기능 클래스에 "status"라는 필드가 포함되어 있으며 동일한 오류가 발생합니다.
Emi

첫 번째 줄이 작동하면 두 번째 줄은 작동하지 않습니다.
mhoran_psprep

레이어의 정보를 변경했지만
피쳐 클래스

1

field.type을 AddField_management 메소드의 필드 유형에 매핑하려면 어떻게해야합니까?

게시물 에 따르면 자동으로 수행됩니다 .

그리고 필드가 중간 위치에있는 동안 필드는 중간에서 삭제되어 마지막에 추가됩니다. 필드 이름이 바뀌는 것처럼 보이지 않습니다. 이 작업을 수행하는 데 도움이되는 더 나은 솔루션이 있습니까?

다른 질문 에서 언급했듯이 다른 옵션은 전체 기능 클래스 / 테이블을 삭제하고 다시 만들거나 기본 DBMS에서 열 정의를 수정하는 것입니다.

모든 사용자 열을 삭제하고 원하는 순서로 다시 만들 있다고 가정 하지만 약간 미친 듯합니다. 이 답변 의 스크립트 는 정확하게 수행하므로 필요에 맞게 조정할 수 있습니다.


field.type = "string"동안 AddField_management에서 "text"를 전달해야합니다. 확인했습니다.
Emi

확실해? 10.0 SP5에서 작동합니다.
blah238

오류 : arcgisscripting.ExecuteError : 실행하지 못했습니다. 매개 변수가 유효하지 않습니다. 오류 000800 : 값이 TEXT | 플로트 | 더블 | 짧은 | 긴 | 날짜 | BLOB | 래스터 | GUID. (AddField)를 실행하지 못했습니다.
Emi

현재 어떤 버전 / SP입니까?
blah238

10.0을 사용하고 있습니다. 서비스 팩 번호를 모릅니다.
Emi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.