Более

Итерация курсора arcpy.da не началась?

Итерация курсора arcpy.da не началась?


Я пытаюсь преобразовать курсоры, написанные в 10.0, для использования нового модуля arcpy.da в 10.2.1. Если я прохожу код в режиме отладки, он переходит в цикл for; однако, когда я пытаюсь запустить код, я получаю исключение : итерация не началась

код для 10.0

для строки в updateCursor: если row.getValue ("STREET_NUMBER_PREFIX") в ['N', 'S', 'W']: row.setValue ("STREET_DIR_PREFIX", row.getValue ("STREET_NUMBER_PREFIX")) row.setValue ( "STREET_NUMBER_PREFIX", нет)

код для 10.2.1

с arcpy.da.UpdateCursor (civicAddress, flds) как строки: для строки в строках: если строка [0] в ['N', 'S', 'W']: row [1] = row [0] row [ 0] = Нет

Что я могу сделать, чтобы решить мою проблему?

У меня есть довольно много блоков кода, как указано выше, которые имеют дело с конкретными логическими случаями.

Вот полный код этого раздела, возможно, это поможет:

flds = ("STREET_NUMBER_PREFIX", "STREET_DIR_PREFIX", "STREET_NUMBER_SUFFIX", "CIVIC_ID") flds2 = ("CIVIC_ID", "UNIT_NUMBER") log.information ("Создание курсоров ...") insertCursor.Address () flds2) #row = [] с arcpy.da.UpdateCursor (civicAddress, flds) в виде строк: для строки в строках: если строка [0] в ['N', 'S', 'W']: строка [1] = row [0] row [0] = Нет, если строка [2] в ['N', 'S', 'W']: row [1] = row [2] row [2] = Нет, если строка [2] ] в unitLst: newrow = insertCursor.newRow () newrow [0] = row [3] newrow [1] = row [2] row [2] = None insertCursor.insertRow (newrow) if row [0] in unitLst: newrow = insertCursor.newRow () newrow [0] = row [3] newrow [1] = row [0] row [0] = None insertCursor.insertRow (newrow) try: if re.match ("[0-9] [ AZ] ", строка [0]) или повторное сопоставление (" [0-9] [0-9] [AZ] ", строка [0]) или  re.match (" [AZ] [0-9] ", row [0]) или re.match (" [AZ] [0-9] [0-9] ", row [0]): newrow = insertCursor.newRow () newrow [0] = row [3] newrow [1] = row [0] row.setValue ("STREET_NUMBER_PREFIX", None) row [0] = None insertCursor.insertRow (ne wrow) except: pass try: if re.match («[0-9] [AZ]», строка [2]) или re.match («[0-9] [0-9] [AZ]», row [2]) или  re.match («[AZ] [0-9]», строка [2]) или re.match («[AZ] [0-9] [0-9]», строка [2] ]): newrow = insertCursor.newRow () newrow [0] = row [3] newrow [1] = row [2] row [2] = None insertCursor.insertRow (newrow) except: pass try: if row [0] .isdigit (): newrow = insertCursor.newRow () newrow [0] = row [3] newrow [1] = row [0] row.setValue ("STREET_NUMBER_PREFIX", None) row [0] = None insertCursor.insertRow ( newrow) except: pass try: #if row.getValue ("STREET_NUMBER_SUFFIX"). isdigit (): if row [2] .isdigit (): newrow = insertCursor.newRow () # newrow.setValue ("CIVIC_ID", row. getValue ("CIVIC_ID")) newrow [0] = row [3] # newrow.setValue ("UNIT_NUMBER", row.getValue ("STREET_NUMBER_SUFFIX")) newrow [1] = row [2] # row.setValue ("STREET_NUMBER_SUFFIX ", None) row [2] = None insertCursor.insertRow (newrow), кроме: pass rows.updateRow (row) del row del newrow del rows

Если вы хотите делать обновления с помощью UpdateCursor, вам нужно переместитьrows.updateRow (строка)внутри вашего цикла for:

с arcpy.da.UpdateCursor (civicAddress, flds) as rows: for row in rows:… snip… rows.updateRow (row) # должен быть с отступом внутри цикла del row del newrow del rows

Бьюсь об заклад, проблема связана с смешиваниемUpdateCursorsсInsertCursors. Вместо того, чтобы обрабатывать обе одновременно, я предлагаю разделить их.

Создайте пустой список перед любым из них.

li = []

Удалите вашInsertCursorс начала скрипта, и любыеnewrow = insertCursor.newRow ()также следует удалить. Затем замените все своиinsertCursor.insertRow (новая строка)сli.append ((строка [x], строка [y])), где x и y - соответствующие индексы.

Наконец, как только вашUpdateCursorзавершено, выполните свойInsertCursorсо строками из вашего списка.

insertCursor = arcpy.da.InsertCursor (subAddress, flds2) для rw в li: insertCursor.insertRow (rw)