使用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)行上出现错误的原因。
艺术品

2
setNewName(索引,new_field_name)必须仅用于设置新字段名,而不重命名现有字段名。
艺术品

2
FieldInfo对象对基础数据不做任何事情,它只是字段属性的表示,可以用作某些工具的输入来创建新数据,类似于FieldMappings对象。
blah238

1
old_field变量名还是旧字段的实际名称?如果它是一个变量名,则需要使用字符串格式设置或串联操作来将变量的值括在方括号(VB解析器)或感叹号(Python解析器)中。
blah238

1
一个别名,一般是一个“昵称”或化名。它不一定等于数据库中的实际列名。
blah238

Answers:


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)

@Emi,我不明白您所说的“两个字段类型相同”是什么意思?您是否希望将“状态”中的值放在一个名为“状态”的新字段中?
艺术品

是的,我希望将“状态”中的值放入名为“ stat”的新字段中
Emi

我也尝试fieldInfo.addField ("status", "stat", "VISIBLE", "NONE")fieldInfo.setNewName(index, "stat")。但是我的代码也发生了同样的错误。
艾米(Emi)2013年

对于rows = arcpy.UpdateCursor(inputFeatureClass),也许尝试行= arcpy.UpdateCursor(layer)
Artwork21年


3

要重命名表或要素类中的字段,我将尝试此处描述的过程。

  1. 启动ArcMap并打开目录窗口。
  2. 找到包含您要更改的表的数据库。
  3. 右键单击该表,然后单击“属性”。
  4. 单击字段选项卡。
  5. 单击“字段名称”列中的现有文本,然后键入一个新名称。

我刚刚使用ArcGIS for Desktop Standard 10.1 SP1在文件地理数据库表上对此进行了测试,并且工作正常。

不幸的是,编写此文件后,我搜索了ArcGIS 10.1 PDF文件中的新增功能,发现该功能可能已在该版本中添加-仍然值得测试最新的10.0 Service Pack,以查看是否也将其移植回该版本。


1
我相信Emi正在寻找解决方案。
艺术品

实际上,我正在寻找arcpy解决方案
Emi

1
我的错误-我以为@Emi说:“有没有任何更好的解决办法......” [我加粗。
PolyGeo

1

代码有两个大问题:

  • 如果dataType不是FeatureLayer,则程序将跳过fieldinfo操作,然后尝试将值设置为从未创建/重命名的新字段/重命名字段

  • 两行:

    gValue = row.getValue("status")

    row.setValue("stat", gValue)

    有一个大问题。如果先前的代码有效,则“状态”字段不存在。


我检查了代码,同时,它是要素图层,并且要素类包含一个名为“ status”的字段,并给出了相同的错误
Emi 2013年

如果第一行有效,则第二行无效。
mhoran_psprep

您更改了图层中的信息,但是正在要素类中读写数据
mhoran_psprep

1

如何将field.type映射到AddField_management方法的字段类型?

根据这篇文章,这是自动完成

而当字段位于中间位置时,则将该字段从中间位置删除并添加到最后一个位置。看起来好像没有重命名字段名称。有没有更好的解决方案可以帮助我完成这些任务?

正如我在另一个问题中提到的那样,您唯一的其他选择是删除并重新创建整个要素类/表,或修改基础DBMS中的列定义。

我想您可以删除所有用户列,然后按所需顺序重新创建它们,但这有点疯狂。此答案中的脚本正是这样做的,您可以根据需要进行调整。


而field.type =“ string”时,我们必须在AddField_management传递“ text”。我已经检查过了
Emi

你确定吗?它在10.0 SP5对我有效。
blah238

它给我错误:arcgisscripting.ExecuteError:执行失败。参数无效。错误000800:该值不是TEXT |的成员。浮法| 双| 短裤 长| DATE | BLOB | 栅格| GUID。执行失败(AddField)。
艾米(Emi)

您使用什么版本/ SP?
blah238 2013年

我正在使用10.0。我不知道服务包编号。
艾米(Emi)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.