Перейменування поля за допомогою 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 (індекс, "stat"). Ось чому ви отримуєте помилку в рядку row.setValue ("stat", gValue).
художній твір21

2
setNewName (індекс, new_field_name) повинен бути лише для встановлення нових імен полів, а не для перейменування існуючих.
художній твір21

2
Об'єкт FieldInfo нічого не робить із базовими даними, це просто представлення властивостей поля, які можуть бути використані як вхід до певних інструментів для створення нових даних, подібних до об'єкта FieldMappings.
blah238

1
Чи old_fieldім'я змінної чи фактична назва старого поля? Якщо це ім'я змінної, вам потрібно використовувати форматування рядків або конкатенацію, щоб обернути значення змінної дужками (VB-аналізатор) або знаками оклику (Python parser).
blah238

1
Ім'я користувача в цілому є «нік» або псевдонім . Це не обов'язково дорівнює фактичному імені стовпця в базі даних.
blah238

Відповіді:


15

Спробуйте це, використовуючи комбінацію інструментів Додати поле, обчислити поле та видалити аркпію поля:

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 не є однаковими. Що робити?
Емі

@Emi, я не розумію, що ви маєте на увазі під "двома типами поля"? Ви хочете, щоб значення в "статусі" було введене в нове поле під назвою "stat"?
художній твір21

так, я хочу, щоб значення в "статусі" було введено в нове поле під назвою "stat"
Емі

Я також спробував fieldInfo.addField ("status", "stat", "VISIBLE", "NONE")замість fieldInfo.setNewName(index, "stat"). Але така ж помилка сталася і з моїм кодом.
Емі

Для рядків = arcpy.UpdateCursor (inputFeatureClass), можливо, спробуйте рядки = arcpy.UpdateCursor (шар)
artwork21

9

Тепер ви можете перейменувати поле за допомогою основного інструменту GP ArcGIS Desktop - Alter Field (управління даними) . Цей інструмент надає можливість перейменувати поля або псевдоніми перейменувати поле для будь-якої таблиці геоданих або класу функцій.

Цей інструмент доступний починаючи з 10.2.1 .


5
Це підтримує лише певні формати даних. Помітно, це призводить до помилки у форматі файлів.
jpmc26

3

Для перейменування поля в таблиці або класах функцій я б спробував описану тут процедуру .

  1. Запустіть ArcMap та відкрийте вікно Каталог.
  2. Знайдіть базу даних, яка містить таблицю, яку ви хочете змінити.
  3. Клацніть правою кнопкою миші таблицю та натисніть Властивості.
  4. Перейдіть на вкладку Поля.
  5. Клацніть наявний текст у стовпці Ім'я поля та введіть нове ім’я.

Я щойно перевірив це на файлі таблиці геоданих за допомогою ArcGIS для Desktop Standard 10.1 SP1, і він працював чудово.

На жаль, після написання цього запиту я шукав що нового у файлі PDF ArcGIS 10.1 і виявив, що ця функціональність може бути додана в цій версії - все-таки варто перевірити останній пакет оновлень 10.0, щоб побачити, чи він також був перенесений туди.


1
Я вважаю, Емі шукає рішення для дуги.
artwork21

Насправді я шукаю рішення arcpy
Емі,

1
Моя помилка - я думав , що @Emi сказала : «Чи є якесь - небудь краще рішення ...» [моє закипання].
PolyGeo

1

дві великі проблеми з кодом:

  • якщо тип даних не є FeatureLayer, програма буде пропускати польові маніпуляції, а потім намагатиметься встановити значення для нового / перейменованого поля, яке ніколи не було створено / перейменовано

  • Два рядки:

    gValue = row.getValue("status")

    row.setValue("stat", gValue)

    є велика проблема. Якщо раніше працював код Поле "статус" не існує.


Я перевірив код, і поки він є функціональним рівнем, і клас класів містить поле під назвою "статус", дає ту саму помилку
Емі,

Якщо перший рядок працює, другий рядок не буде.
mhoran_psprep

ви змінили інформацію в шарі, але читаєте та записуєте дані з / у функціональний клас
mhoran_psprep

1

Як я можу зіставити field.type на тип поля поля методу AddField_management?

Це робиться автоматично, відповідно до цього допису .

І поки поле знаходиться на середньому місці, то поле видаляється із середини та додається до останнього. Це не схоже на те, що ім’я поля перейменовано. Чи є краще рішення, яке допоможе мені зробити ці речі?

Як я вже згадував у вашому іншому запитанні , ваші єдині інші варіанти - це скинути і заново створити весь клас / таблицю характеристик або змінити визначення стовпця в базовій СУБД.

Я припускаю, що ви можете видалити всі стовпці користувачів та знову створити їх у потрібному порядку, але це трохи божевільно. Сценарій у цій відповіді робить саме це, ви, ймовірно, могли адаптувати його під свої потреби.


в той час, як field.type = "string", ми повинні передавати "текст" у AddField_management. Я це перевірив.
Емі

Ти впевнений? Він працює для мене на 10.0 SP5.
blah238

Це дає мені помилку: arcgisscripting.ExecuteError: Не вдалося виконати. Параметри недійсні. ПОМИЛКА 000800: значення не є членом TEXT | ПЛІТ | ДВОЙНИЙ | КОРОТКА | ДОЛГ | ДАТА | BLOB | РАСТЕР | ДОГОВІР. Не вдалося виконати (AddField).
Емі

У якій версії / СП Ви знаходитесь?
blah238

Я використовую 10.0. Я не знаю номер сервісного пакета.
Емі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.