Select to view content in your preferred language

Calculate Field based on Filename

744
5
11-19-2012 06:16 AM
ChristopherClark1
Deactivated User
Ok, this seems simple but I am havnig issues figuring out how to incorporate the filename aspect.

I have a gdb with several Polyline feature classes. In each of these feature classes I have a SPECCODE field. I want to calculate this field based on the file name of the feature class.

EXAMPLE : Feature Classes (STHD, PINK, SOCK, COHO) I would want the SPECCODE field values to be SH, PK, SO, CO respectively for the features classes given.

So I am thinking a script with a If... like:
if featureclass name == STHD than SPECCODE == SH
Else featureclass name == Pink than SPECCODE == PK
Else featureclass name == Sock than SPECCODE == SO


Am I even on the right track here??
Tags (2)
0 Kudos
5 Replies
JakeSkinner
Esri Esteemed Contributor
Here is an example:

import arcpy
from arcpy import env
env.workspace = r"C:\temp\python\test.gdb"

lstFDs = arcpy.ListDatasets("*")
for dataset in lstFDs:
    lstFCs = arcpy.ListFeatureClasses("*", "POLYLINE", dataset)
    for fc in lstFCs:
        if fc == 'Pink':
            rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
            for row in rows:
                row.SPECCODE = 'PK'
                rows.updateRow(row)
        elif fc == 'Coho':
            rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
            for row in rows:
                row.SPECCODE = 'CO'
                rows.updateRow(row)

lstFCs = arcpy.ListFeatureClasses("*", "POLYLINE")
for fc in lstFCs:
    if fc == 'Pink':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'PK'
            rows.updateRow(row)
    elif fc == 'Coho':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'CO'
            rows.updateRow(row)

del row, rows


You will just need to add more 'elif' statements for all of your feature  class names.  The above code will work for polylines as a stand-alone  feature class, or a feature class within a feature dataset.
0 Kudos
ChristopherClark1
Deactivated User
I run this code :

import arcpy
from arcpy import env
env.workspace = r"G:\ChrisGIS\HUC_8\17100101.gdb"
#
#
#
lstFCs = arcpy.ListFeatureClasses("*", "POLYLINE")
for fc in lstFCs:
    if fc == 'BullTrout_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'BLC'
            rows.updateRow(row)
    elif fc == 'Chinook_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'CK'
            rows.updateRow(row)
 elif fc == 'Chum_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'CH'
            rows.updateRow(row)
 elif fc == 'Coho_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'CO'
            rows.updateRow(row)
 elif fc == 'Kokanee_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'K'
            rows.updateRow(row)
 elif fc == 'Pink_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'PK'
            rows.updateRow(row)
 elif fc == 'Rainbow_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'RB'
            rows.updateRow(row)
 elif fc == 'Sockeye_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'SO'
            rows.updateRow(row)
 elif fc == 'STHD_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'SH'
            rows.updateRow(row)  

del row, rows


But get this error : Parsing error <type 'exceptions.SyntaxError'>: invalid syntax (line 19)

I do not see the error in line 19
0 Kudos
JakeSkinner
Esri Esteemed Contributor
Your subsequent 'elif' statements after the first one are indented.  Be sure these are aligned with your other if/elif statements.
0 Kudos
ChristopherClark1
Deactivated User
import arcpy
from arcpy import env
env.workspace = r"G:\ChrisGIS\HUC_8\17100101.gdb"
#
#
#
lstFCs = arcpy.ListFeatureClasses("*", "POLYLINE")
for fc in lstFCs:
    if fc == 'BullTrout_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'BLC'
            rows.updateRow(row)
    elif fc == 'Chinook_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'CK'
            rows.updateRow(row)
elif fc == 'Chum_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'CH'
            rows.updateRow(row)
elif fc == 'Coho_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'CO'
            rows.updateRow(row)
elif fc == 'Kokanee_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'K'
            rows.updateRow(row)
elif fc == 'Pink_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'PK'
            rows.updateRow(row)
elif fc == 'Rainbow_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'RB'
            rows.updateRow(row)
elif fc == 'Sockeye_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'SO'
            rows.updateRow(row)
elif fc == 'STHD_DIST':
        rows = arcpy.UpdateCursor(fc, "", "", "SPECCODE")
        for row in rows:
            row.SPECCODE = 'SH'
            rows.updateRow(row) 
For some reason the code block came out like that, but when entered into Python window in Arc it is not misaligned as such. They are indented correctly and I sitll get the error.
0 Kudos
ChristopherClark1
Deactivated User
Yep, there was a small space and they were not infact the same!

THanks!!!!
0 Kudos