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.typeするにはどうすればよいAddField_managementですか?そして、フィールドが中間の場所にある間、フィールドは中間から削除され、最後に追加されます。フィールド名が変更されたかのようには見えません。

これらのことを行うのに役立つより良い解決策はありますか?


ここでは、フィーチャレイヤーフィールドの名前は変更されていません、fieldInfo.setNewName(index、 "stat")。これが、行row.setValue( "stat"、gValue)でエラーが発生する理由です。
アートワーク21

2
setNewName(index、new_field_name)は、既存のフィールド名を変更するのではなく、新しいフィールド名を設定するためだけに使用する必要があります。
アートワーク21

2
FieldInfoオブジェクトは、基になるデータに対して何も行いません。これは、FieldMappingsオブジェクトと同様に、新しいデータを作成するための特定のツールへの入力として使用できるフィールドプロパティの表現です。
blah238 2013

1
あるold_field変数名または古いフィールドの実際の名前は?変数名の場合は、文字列フォーマットまたは連結を使用して、変数の値を角括弧(VBパーサー)または感嘆符(Pythonパーサー)で囲む必要があります。
blah238 2013

1
別名、一般的には、「ニックネーム」または仮名。データベースの実際の列名と必ずしも同じではありません。
blah238 2013

回答:


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
2つのフィールドタイプを同じにしたい。しかし、field.TypeとAddField_managementメソッドのfield_type名は同じではありません。何をすべきか?
エミ

@えみ、「2つのフィールドタイプが同じ」という意味がわかりませんか?「status」の値を「stat」という新しいフィールドに入力しますか?
アートワーク21

はい、「status」の値を「stat」という新しいフィールドに入力します
Emi

fieldInfo.addField ("status", "stat", "VISIBLE", "NONE")代わりにも試してみましたfieldInfo.setNewName(index, "stat")。しかし、私のコードで同じエラーが発生しました。
エミ

rows = arcpy.UpdateCursor(inputFeatureClass)の場合、たぶんrows = arcpy.UpdateCursor(layer)を試してください
アートワーク21

9

コアのArcGIS Desktop GPツール-Alter Field(Data Management)を使用してフィールドの名前を変更できるようになりました。このツールは、ジオデータベーステーブルまたはフィーチャクラスのフィールド名またはフィールドエイリアス名を変更する機能を提供します。

このツールは10.2.1以降で使用できます


5
これは特定のデータ形式のみをサポートします。特に、シェープファイルでエラーが発生します。
jpmc26 2016

3

テーブルまたはフィーチャクラスのフィールドの名前を変更するには、ここで説明する手順を試します

  1. ArcMapを起動し、カタログウィンドウを開きます。
  2. 変更するテーブルを含むデータベースを見つけます。
  3. テーブルを右クリックし、[プロパティ]をクリックします。
  4. [フィールド]タブをクリックします。
  5. [フィールド名]列の既存のテキストをクリックして、新しい名前を入力します。

ArcGIS for Desktop Standard 10.1 SP1を使用してファイルジオデータベーステーブルでこれをテストしたところ、問題なく動作しました。

残念ながら、これを書いた後、「ArcGIS 10.1の新機能」PDFファイルを検索したところ、この機能がそのバージョンで追加されている可能性があることがわかりました。それでも、最新のサービスパック10.0をテストして、そこに移植されているかどうかを確認する価値はあります。


1
Emiは難しい問題の解決策を探していると思います。
アートワーク21

実際、私はarcpyソリューションを探しています
Emi

1
私の間違い-@Emiが「もっと良い解決策はありますか?」[私の太字] と言ったと思いました。
PolyGeo

1

コードに関する2つの大きな問題:

  • dataTypeがFeatureLayerでない場合、プログラムはfieldinfo操作をスキップし、作成または名前変更されたことのない新しい/名前変更されたフィールドに値を設定しようとします

  • 2行:

    gValue = row.getValue("status")

    row.setValue("stat", gValue)

    大きな問題があります。以前のコードが機能した場合フィールド「ステータス」は存在しません。


コードをチェックしましたが、それはフィーチャレイヤーであり、フィーチャクラスには「ステータス」というフィールドが含まれていますが、同じエラーが発生します
Emi

1行目が機能する場合、2行目は機能しません。
mhoran_psprep 2013

レイヤーの情報を変更したが、featureclassとの間でデータの読み取りと書き込みを行っている
mhoran_psprep

1

field.typeをAddField_managementメソッドのフィールドタイプにマップするにはどうすればよいですか?

この投稿によると、これは自動的に行われます。

そして、フィールドが中間の場所にある間、フィールドは中間から削除され、最後に追加されます。フィールド名が変更されたかのようには見えません。これらのことを行うのに役立つより良い解決策はありますか?

他の質問で述べたように、他の唯一のオプションは、フィーチャクラス/テーブル全体を削除して再作成するか、基になるDBMSの列定義を変更することです。

すべてのユーザー列を削除して、希望する順序で再作成できると思います、それは少しおかしいです。この回答のスクリプトはそれを正確に実行します。おそらくそれをニーズに適合させることができます。


一方、field.type = "string"の場合、AddField_managementで「text」を渡す必要があります。確認しました。
エミ

本気ですか?10.0 SP5で動作します。
blah238 2013

エラー:arcgisscripting.ExecuteError:実行に失敗しました。パラメータが無効です。エラー000800:値はTEXTのメンバーではありません| FLOAT | DOUBLE | SHORT | 長い| 日付| BLOB | ラスター| GUID。実行に失敗しました(AddField)。
エミ

現在どのバージョン/ SPにいますか?
blah238 2013

10.0を使用しています。サービスパック番号がわかりません。
エミ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.