Daha çox

Arcpy.da kursor təkrarlanması başlamadı?


10.0-da yazılmış imlecləri 10.2.1-də yeni arcpy.da modulundan istifadə etmək üçün çevirməyə çalışıram. Kod ayaqlaşma rejimində addım atsam, for döngəsinə daxil olur; Ancaq kodu çalıştırmaya çalışdığımda bir istisna alıram : yineleme başlamadı

10.0 üçün kod

updateCursordakı satır üçün: ['N', 'S', 'W'] içindəki row.getValue ("STREET_NUMBER_PREFIX"): row.setValue ("STREET_DIR_PREFIX", row.getValue ("STREET_NUMBER_PREFIX")) sıra.setValue ( "STREET_NUMBER_PREFIX", Yoxdur)

10.2.1 üçün kod

arcpy.da.UpdateCursor ilə (civicAddress, flds) sətirlər kimi: sətirlərdə sətir üçün: əgər sətirlərdə [0] əgər ['N', 'S', 'W']: sətir [1] = sətir [0] sətir [ 0] = Yoxdur

Problemimi həll etmək üçün nə edə bilərəm?

Xüsusi məntiq halları ilə məşğul olan yuxarıdakı kimi bir neçə kod blokum var.

Bu bölmə üçün tam kod budur, bəlkə də kömək edəcək:

flds = ("STREET_NUMBER_PREFIX", "STREET_DIR_PREFIX", "STREET_NUMBER_SUFFIX", "CIVIC_ID") flds2 = ("CIVIC_ID", "UNIT_NUMBER") log.information ("Cursors yaradılması ...") insertCurs.or flds2) #row = [] arcpy.da.UpdateCursor (civicAddress, flds) ilə satır şəklində: satır sırası üçün: əgər satır [0] ['N', 'S', 'W'] içərisində: satır [1] = sıra [0] sıra [0] = ['N', 'S', 'W'] sətirində [2] olmadıqda: satır [1] = sətir [2] sətir [2] = Sətirdə yoxsa 2 ] unitLst-də: newrow = insertCursor.newRow () newrow [0] = row [3] newrow [1] = row [2] row [2] = Heç biri insertCursor.insertRow (newrow) if satır [0] in unitLst: newrow = insertCursor.newRow () newrow [0] = row [3] newrow [1] = row [0] row [0] = Heç biri insertCursor.insertRow (newrow) try: if re.match ("[0-9] [ AZ] ", sıra [0]) və ya re.match (" [0-9] [0-9] [AZ] ", sıra [0]) və ya  re.match (" [AZ] [0-9] ", sıra [0]) və ya re.match (" [AZ] [0-9] [0-9] ", sıra [0]): newrow = insertCursor.newRow () newrow [0] = row [3] newrow [1] = sıra [0] row.setValue ("STREET_NUMBER_PREFIX", Yoxdur) sıra [0] = Yox insertCursor.insertRow (ne wrow) xaricində: pass cəhd edin: if re.match ("[0-9] [AZ]", row [2]) or re.match ("[0-9] [0-9] [AZ]", row [2]) və ya  re.match ("[AZ] [0-9]", sıra [2]) və ya re.match ("[AZ] [0-9] [0-9]", sıra [2 ]): newrow = insertCursor.newRow () newrow [0] = row [3] newrow [1] = row [2] row [2] = Heç biri insertCursor.insertRow (newrow) xaricində: pass try: if sıra [0] .isdigit (): newrow = insertCursor.newRow () newrow [0] = row [3] newrow [1] = row [0] row.setValue ("STREET_NUMBER_PREFIX", None) row [0] = Heç insertCursor.insertRow ( newrow) xaricində: pass cəhd edin: #if sıra.getValue ("STREET_NUMBER_SUFFIX"). isdigit (): əgər sıra [2] .isdigit (): newrow = insertCursor.newRow () # newrow.setValue ("CIVIC_ID", sıra. getValue ("CIVIC_ID")) newrow [0] = sıra [3] # newrow.setValue ("UNIT_NUMBER", row.getValue ("STREET_NUMBER_SUFFIX")) newrow [1] = sıra [2] # sıra.setValue ("STREET_NUMBER_SUFFIX) ", Yoxdur) sətir [2] = Yoxdur insertCursor.insertRow (yeni doğan) xaricində: pass rows.updateRow (row) del row del newrow del rows

UpdateCursor ilə yeniləmələr etmək istəyirsinizsə, hərəkət etməlisinizrows.updateRow (sıra)for for for loop:

arcpy.da.UpdateCursor ilə (civicAddress, flds) sətirlər kimi: sətir sırası üçün:… snip… rows.updateRow (sıra) # loop daxilində girinti edilməlidir del sıra del newrow del sətirlər

Məsələ qarışmaqdan qaynaqlandığını düşünürəmUpdateCursorsiləInsertCursors. Hər ikisini eyni vaxtda işləmək əvəzinə, ikisini ayırmağı təklif edirəm.

Hər ikisindən əvvəl boş bir siyahı yaradın.

li = []

SəninInsertCursorssenarinin əvvəlindən və hər hansı birindənnewrow = insertCursor.newRow ()də qaldırılmalıdır. Sonra hamısını dəyişdirininsertCursor.insertRow (yeni doğan)iləli.append ((sıra [x], sıra [y])), burada x və y uyğun göstəricilərdir.

Nəhayət, bir dəfə sizinUpdateCursortamamlandı, yerinə yetirinInsertCursorsiyahınızdakı satırlarla.

insertCursor = arcpy.da.InsertCursor (subAddress, flds2) rw üçün li: insertCursor.insertRow (rw)