Attribute Updating using ArcPy

After my first attempt in Python scripting using opensource Geospatial Data Abstraction Library (GDAL), I wanted to use ArcPy Β in my second trial.

The following code is so simple. You can use it to update the attribute table of a shapefile based on another shapefile/table.

Let me break it down using this pseudo-code:

  1. Choose the first shapefile (the source).
  2. Identify the unique ID field in thatΒ shapefile.
  3. Write down all the values from the desired field (to replace the old values).
  4. Choose the second shapefile (the destination).
  5. Search forΒ the unique ID records which meetΒ that unique ID field in (step 2).
  6. Update the values of a certain field (in all the records that exist in both shapefiles –Β from the source to the destination).

let’s see the code

1. Choosing the first shapefile (the source):

Since we are going to to write a stand-alone script, the “import ArcPy”Β statement is needed to import the ArcPy site package, including all itsΒ modules and functions.

import arcpy

When referencing data on disk, you can limit the need to writeΒ the full path by setting the workspace as part of the environmentΒ properties. For example, myΒ workspace is the Data folder

from arcpy import env
env.workspace = "C:/Data"

Now we are going to choose our source shapefile, which should be inside the workspace.Β Usually, it’s an updated subset from the original shapefile

fc= "Updated_subset.shp"

2.Identifying the unique ID field in thatΒ shapefile:

To do so, we will iterate over the rows in the attribute table of the source. This is can be done using the SearchCursor function. in my case, the unique ID field is FID

cursor = arcpy.da.SearchCursor(fc, ["FID"])
for row in cursor:
   SQL_stat= "FID = "+ str(row[0])

The “SQL_stat” – as it implies – is an SQL statement which will be used later on (in steps 3&6). Since the SQL statement should be in a sting format, we will use str() to convert the FID from integer to string.

3.Choosing the second shapefile (the destination):

We won’t do anything new rather than referring to our destination shapefile

   fc2 = "airports_old.shp"

4.Writing down the value ofΒ the desired field ( i.e. “STATE”)

   cursor2 = arcpy.da.SearchCursor(fc, ["STATE"], SQL_stat)
   for row2 in cursor2:
      UpdatedValue = row2[0]

I wish you’ve noticed the SQL_stat.

5&6. Searching forΒ the unique ID records (in the destination) which meetΒ that unique ID field in (step 2) and update the desired values.

      cursor3 = arcpy.da.UpdateCursor(fc2, ["STATE"],SQL_stat)
      for row3 in cursor3:
         row3[0] = UpdatedValue
         cursor3.updateRow(row3)

We’ve used “Update cursors”Β to update attribute values. SinceΒ this will permanently modify the data, it is a good idea to copy the data first.

Finally, we end itΒ with the following lines

del row
del cursor
del row2
del cursor2
del row3
del cursor3

Hope you enjoyed it.

Feel free to download my second tool “AttributeUpdater“.

Before
Before
After
After

Your comments are more than welcome.

0 0 votes
Article Rating
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Jason Pardy
Jason Pardy
9 years ago

You could do this using the Join Field tool. However, this tool can be slow:

arcpy.JoinField_management(fc2, “FID”, “fc”, “FID”, [“STATE”])

Or you can do it this way much faster:

arcpy.AddField_management(“citiesCopy”, “STATE_NAME”, “TEXT”)
arcpy.AddJoin_management(“citiesCopy”, “FID”, “cities”, “FID”) arcpy.CalculateField_management(“citiesCopy”, “citiesCopy.STATE_NAME”, “!cities.STATE_NAME!”, “PYTHON”)
arcpy.RemoveJoin_management(“citiesCopy”)

Habboub
Habboub
9 years ago
Reply to  Jason Pardy

Thanks Jason for your comment. I’ll try it πŸ™‚