Renomeando campo usando o ArcPy?

9

O que eu preciso fazer:

  1. renomear um nome de campo de uma tabela / classe de recurso
  2. copie todos os valores para o novo campo

Até agora, fiz o seguinte código, como sugere @ 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)

Como posso mapear field.typepara AddField_managemento tipo de campo do método? E enquanto o campo estiver em um local intermediário, o campo será excluído do meio e adicionado ao último. Isso não parece como se o nome do campo fosse renomeado.

Existe alguma solução melhor que me ajude a fazer essas coisas?

Emi
fonte
O campo da camada de recurso não está sendo renomeado aqui, fieldInfo.setNewName (index, "stat"). É por isso que você está recebendo o erro na linha row.setValue ("stat", gValue).
artwork21
2
setNewName (index, new_field_name), deve ser apenas para configurar novos nomes de campo, sem renomear nomes existentes.
artwork21
2
Um objeto FieldInfo não faz nada com os dados subjacentes, é simplesmente uma representação das propriedades do campo que pode ser usada como entrada para certas ferramentas para criar novos dados, semelhante a um objeto FieldMappings.
blah238
11
É old_fieldum nome de variável ou o nome real do campo antigo? Se for um nome de variável, você precisará usar a formatação ou concatenação de seqüência de caracteres para agrupar o valor da variável entre colchetes (analisador VB) ou pontos de exclamação (analisador Python).
precisa saber é o seguinte
11
Um alias em geral é um "apelido" ou um pseudônimo . Não é necessariamente igual ao nome da coluna real no banco de dados.
blah238

Respostas:

15

Tente fazer isso usando uma combinação das ferramentas do arco Adicionar campo, Calcular campo e Excluir campo:

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")
artwork21
fonte
11
Quero tornar os dois campos do mesmo tipo. mas os nomes field_type do método field.Type e AddField_management não são os mesmos. O que fazer?
IEM
@ Emi, não estou entendendo o que você quer dizer com "dois tipos de campos iguais"? Você deseja que o valor em "status" seja colocado em um novo campo chamado "stat"?
artwork21
sim eu quero o valor em "status", para colocar no novo campo chamado "status"
Emi
Eu também tentei em fieldInfo.addField ("status", "stat", "VISIBLE", "NONE")vez de fieldInfo.setNewName(index, "stat"). Mas o mesmo erro aconteceu com o meu código.
IEM
Para linhas = arcpy.UpdateCursor (inputFeatureClass), talvez tentar linhas = arcpy.UpdateCursor (camada)
artwork21
9

Agora você pode renomear um campo usando a ferramenta principal do ArcGIS Desktop GP - Alter Field (Gerenciamento de dados) . Essa ferramenta fornece a capacidade de renomear campos ou renomear aliases de campo para qualquer tabela de geodatabase ou classe de recurso.

Esta ferramenta está disponível a partir do 10.2.1 .

Alex Tereshenkov
fonte
5
Isso suporta apenas determinados formatos de dados. Notavelmente, gera um erro nos shapefiles.
Jpmc26
3

Para renomear um campo em uma tabela ou classe de recurso, eu tentaria o procedimento descrito aqui .

  1. Inicie o ArcMap e abra a janela Catálogo.
  2. Localize o banco de dados que contém a tabela que você deseja alterar.
  3. Clique com o botão direito do mouse na tabela e clique em Propriedades.
  4. Clique na guia campos.
  5. Clique no texto existente na coluna Nome do campo e digite um novo nome.

Acabei de testar isso em uma tabela de geodatabase usando o ArcGIS for Desktop Standard 10.1 SP1 e funcionou bem.

Infelizmente, depois de escrever isso, pesquisei o arquivo PDF What's New in ArcGIS 10.1 e descobri que essa funcionalidade pode ter sido adicionada nessa versão - ainda pode valer a pena testar o service pack mais recente da 10.0 para ver se ele também foi portado para lá.

PolyGeo
fonte
11
Eu acredito que a Emi está procurando uma solução complicada.
artwork21
Na verdade eu estou procurando solução arcpy
Emi
11
Meu erro - pensei que @Emi disse "Existe alguma solução melhor ..." [meu negrito].
PolyGeo
1

dois grandes problemas com o código:

  • se o dataType não for um FeatureLayer, o programa ignorará as manipulações de informações de campo e tentará definir o valor para um campo novo / renomeado que nunca foi criado / renomeado

  • As duas linhas:

    gValue = row.getValue("status")

    row.setValue("stat", gValue)

    tem um grande problema. Se o código anterior funcionou O campo "status" não existe.

mhoran_psprep
fonte
Eu verifiquei o código e quando, é uma camada de recurso ea classe recurso contém um campo chamado "status", dá o mesmo erro
Emi
Se a primeira linha funcionar, a segunda linha não funcionará.
Mhoran_psprep
você mudou a informação na camada, mas estão lendo e escrevendo dados de / para o featureclass
mhoran_psprep
1

Como mapear field.type para o tipo de campo do método AddField_management?

Isso é feito automaticamente, de acordo com este post .

E enquanto o campo estiver em um local intermediário, o campo será excluído do meio e adicionado ao último. Isso não parece como se o nome do campo fosse renomeado. Existe alguma solução melhor que me ajude a fazer essas coisas?

Como mencionei em sua outra pergunta , suas únicas outras opções são eliminar e recriar toda a classe / tabela de recursos ou modificar a definição de coluna no DBMS subjacente.

Suponho que você possa excluir todas as colunas do usuário e recriá-las na ordem desejada, mas isso é um pouco louco. O script nesta resposta faz exatamente isso, você provavelmente pode adaptá-lo às suas necessidades.

blah238
fonte
enquanto o field.type = "string", temos que passar "text" em AddField_management. Eu verifiquei.
IEM
Você tem certeza? Funciona para mim no 10.0 SP5.
blah238
Isso me dá erro: arcgisscripting.ExecuteError: falha ao executar. Os parâmetros não são válidos. ERRO 000800: O valor não é um membro de TEXT | FLUTUANTE | DUPLO | CURTO | LONGO | DATA | BLOB RASTER | GUID. Falha ao executar (AddField).
IEM
Em qual versão / SP você está?
blah238
Eu estou usando 10.0. Não sei o número do service pack.
IEM