Below is the script I have been attempting to run, I have cannibalized it from several python scripts I have found online.
with arcpy.da.UpdateCursor(fcPath, fcFields) as cursor:
for row in cursor:
joinID = row[0]
relatedRecord = dict_RelTbl[joinID]
currentPosition = relatedRecord[2]
row[1] = currentPosition
cursor.updateRow(row)
print ("sucess")
After I run this portion of the script I get this error
KeyError Traceback (most recent call last) In [14]: Line 4: relatedRecord = dict_RelTbl[joinID] KeyError: '{F9F6909A-83FE-4C56-9320-28BC1C37F98A}'
How do I solve this? I have not found anything online that has been helpful.
import arcpy
workspace = r"fgdb"
fcPath = r"feature_layer"
relatedTblPath = r"table"
print ("vehicle inventory and vehicle inspection paths set")
edit = arcpy.da.Editor(r"fgdb")
edit.startEditing(False, True)
edit.startOperation()
print ('in edit session')
relTblFields = ["relglobal", "oildate"]
fcFields = ["GlobalID", "oildate"]
print ("field dict's created")
dict_RelTbl = {}
dateQry="oildate IS NOT NULL"
#Loop through related table and store only the max date for each unique ID.
with arcpy.da.SearchCursor(relatedTblPath, relTblFields) as cursor:
for row in cursor:
joinID = row[0]
if joinID not in dict_RelTbl.keys():
dict_RelTbl[joinID] = row
# if the key is in the dictionary already (one to many relationship), compare the dates and keep the most recent date
else:
curDate = dict_RelTbl[joinID][1]
if row[1] > curDate:
dict_RelTbl[joinID] = row
with arcpy.da.UpdateCursor(fcPath, fcFields) as cursor:
for row in cursor:
joinID = row[0]
relatedRecord = dict_RelTbl[joinID]
currentPosition = relatedRecord[2]
row[1] = currentPosition
cursor.updateRow(row)
print ("sucess")
edit.stopOperation()
edit.stopEditing(True)
print ("done editing")
Thank you all!
KeyError is a standard python exception when you try to access a dictionary key that does not exist. To avoid your script crashing when accessing a non-existant key; either use try/except block or use the get() method of dictionary to access the key (this will return None if the key does not exist instead of throwing an exception.
Try/Except example:
try:
relatedRecord = dict_RelTbl[joinID]
except KeyError:
print(f"{joinID} not in dict_RelTbl")
get() example:
relatedRecord = dict_RelTbl.get(joinID)
if relatedRecord is None:
print(f"{joinID} not in dict_RelTbl")
You could also check if the key exists before trying to access it (joinID in dict_RelTbl), but I prefer the above methods.