Я создал вложенные словарные значения, вызывающие из таблицы, и мне нужно обновить таблицу атрибутов для класса объектов с использованием этих данных. У меня есть работа с двумя жестко закодированными полями в качестве теста, но мне нужно выяснить, как автоматизировать получение длины featFields
и использовать это для указания позиции индекса для каждого обновляемого поля. Итак, вместо жесткого кодирования row[1]
, row[2]
и т. Д. И 'LOCDESC'
и 'RIMELEV'
, я бы использовал переменную, чтобы перейти через позиции индекса для каждого из них.Вложенный курсор обновления Python с вложенным словарем. Должен быть более простой способ
Я работаю на Python. Конечная цель - это набор инструментов для использования в ArcMap 10.2 или 10.3.
import arcpy
arcpy.env.workspace = r"C:/SARP10/MACP_Tool"
#Define fields to update and the field to use as join field
Table = "Test2.csv"
Input = "Test.gdb/MHs"
csvFields = ['Location_Details', 'Elevation']
featFields = ['LOCDESC', 'RIMELEV']
csvKey = "Manhole_Number"
featKey = "FACILITYID"
csvFields.insert(0, csvKey)
featFields.insert(0, featKey)
print csvFields
#Create dictionary to store values from the update table
UpdateDict = {}
#Iterates through the values in the table and stores them in UpdateDict
with arcpy.da.SearchCursor(Table, csvFields) as cursor:
for row in cursor:
UpdateDict[row[0]] = dict(zip(featFields[1:], row[1:]))
print UpdateDict
MHNum = len(UpdateDict) # gets # of MHs to be updated
MHKeys = UpdateDict.keys() # gets key values, i.e. MH numbers
print "You are updating fields for the following {} manholes: {}".format(MHNum, MHKeys)
#Iterates through feature class attribute table and updates desired attributes
with arcpy.da.UpdateCursor(Input, featFields) as cursor:
i = 0
z = 0
for row in cursor:
i += 1
for f in UpdateDict.keys():
if f == row[0]:
row[1] = UpdateDict.values()[z]['LOCDESC']#uses counter and subdict key to call correct value
row[2] = UpdateDict.values()[z]['RIMELEV']#uses counter and subdict key to call correct value
cursor.updateRow(row)
z +=1 #counter keeps track of rows and provides index location for dictionary
print "Updating {} of {} manholes in this submittal: {}.".format(z, MHNum, f)
else:
pass
print "Updated {} of {} rows.".format(MHNum, i)
print "Script completed."
Я попробовал цикл вроде этого прошлой ночью, но он бросает RuntimeError: «Тип значения несовместим с типом поля». Жестко закодированная версия работает отлично, поэтому мне интересно, есть ли проблема с вложенной логикой. Я запустил ваш код точно, за исключением одного изменения: я начал с j в диапазоне (1, len (featFields) -1), чтобы исключить ключ FACILITYID, добавленный в позицию индекса 0. Получение этой ошибки снова ... может кто-нибудь сказать мне Зачем? –
Ошибка типа несовместимого типа _value напоминает, что она пытается поместить строковое значение в числовое поле (т. Е. 'RIMELEV' может быть строкой' '3'' вместо целых чисел' 3'). – Erica
Мой инстинкт говорит то же самое ... но тогда почему жестко закодированная версия работает без ошибок? Что по-другому в зацикленной версии? Это то, что мне нужно для идентификации и исправления, и я в тупике. –