ArcPro Calculate Field with Python Code Block

2718
4
05-23-2018 02:08 PM
abogedain
New Contributor

I have a dataset for utility work permits and we recently started tracking applicant email addresses so I am looking for help in writing a script for the Code Block field to do the bulk of the work of populating emails for the applicants that have more than one permit.  The logic behind this would essentially be:

if ContactName = Joe Schmo

return joe.schmo@gmail.com in the email field

elif ContactName = Jane Doe

return jane.doe@yahoo.com in the email field

then if ContactName = anything else

return nothing

I would like to add more cases to cover more bases, but only spelt out those 3 for brevity.  I have searched and searched already for previous examples and have tried to write several bits to try to accomplish this but to no avail.  Here are the two bits I have tried to run and have gotten nowhere with both:

Email = Reclass(!Email!)

def Reclass(Email):
    if (ContactName = Joe Schmo)
        return joe.schmo@gmail.com
    elif (ContactName = Jane Doe)
        return jane.doe@yahoo.com

_____________________________________________


fieldName = "Email"  
expression = "getClass(!ContactName!, Email!)"  
codeblock = """def getClass(ContactName, Email):  
    if ContactName == 'Joe Schmo':  
        return "joe.schmo@gmail.com"  
    else:  
    return !Email!"""  
arcpy.CalculateField_management(out_feature_class, fieldName, expression, "PYTHON_9.3", codeblock)

______________________________________________

I am using ArcPro, so I know the version of Python that it uses is different than ArcMap's, but that is literally all I know.  I do not know what the differences in the syntaxes are and I do not have experience with any syntax or calling functions with Python or any scripting language.  I have next to no background in scripting, so any help on how to set this up in the Code Block would be greatly appreciated.

0 Kudos
4 Replies
DanPatterson_Retired
MVP Emeritus

expression = "getClass(!ContactName!, Email!)"   missing ! before Email, assuming Email is a field

0 Kudos
abogedain
New Contributor

Yes, "Email" is a field.  Other than that missing !, should that bit of code do the operation I mean it to?  Also, if I want to add other cases to run in the same code, would I use "elif", "else", or "if" for the remaining cases before the null case?

0 Kudos
DanPatterson_Retired
MVP Emeritus
# ---- d is a dictionary
#      fld is emulating your field
#      my_func is a sample function to which you pass the field
#      Then you 'call' the function passing the field name (ie would have ! ! around it
#  sample print, but you would use 'return' instead
d = {'bob': 'bob_email', 'bee': 'bee_email', 'sue': 'sue_email', 'sie': 'sie_email'}

fld = ['sue', 'bob', 'sie', 'no_one']

def my_func(fld):
    """sample function"""
    for i in fld:
        if i in d.keys():
            val = d[i]
        else:
            val = None
        print(val)
        

my_func(fld)
sue_email
bob_email
sie_email
None

if elif else does the program flow control  https://docs.python.org/3.6/tutorial/controlflow.html

but if it is going to get ridiculously long, you might want to consider an alternate approach, like using a dictionary.

JoshuaBixby
MVP Esteemed Contributor

I agree with Dan, this will get messy and impossible to manage fairly quickly.  I think a better approach overall would be to maintain a separate table of users and their e-mail addresses.  Then, you can do a join of the user e-mail address table with the permit table.