You can insert a row into a table or feature class using an InsertCursor
object. If you want to insert attribute values along with the new row, you'll need to supply the values in the order found in the attribute table.
The InsertCursor()
function is used to create an InsertCursor
object that allows you to programmatically add new records to feature classes and tables. The insertRow()
method on the InsertCursor
object adds the row. A row in the form of a list or tuple is passed into the insertRow()
method. The values in the list must correspond to the field values defined when the InsertCursor
object was created. Similar to instances that include other types of cursors, you can also limit the field names returned using the second parameter of the method. This function supports geometry tokens as well.
The following code example illustrates how you can use InsertCursor
to insert new rows into a feature class. Here, we insert two new wildfire points into the California
feature class. The row values to be inserted are defined in a list
variable. Then, an InsertCursor
object is created, passing in the feature class and fields. Finally, the new rows are inserted into the feature class by using the insertRow()
method:
rowValues = [(Bastrop','N',3000,(-105.345,32.234)), ('Ft Davis','N', 456, (-109.456,33.468))] fc = "c:/data/wildfires.gdb/California" fields = ["FIRE_NAME", "FIRE_CONTAINED", "ACRES", "SHAPE@XY"] with arcpy.da.InsertCursor(fc, fields) as cursor: for row in rowValues: cursor.insertRow(row)
In this recipe, you will use InsertCursor
to add wildfires retrieved from a .txt
file into a point feature class. When inserting rows into a feature class, you will need to know how to add the geometric representation of a feature into the feature class. This can be accomplished by using InsertCursor
along with two miscellaneous objects: Array
and Point
. In this exercise, we will add point features in the form of wildfire incidents to an empty point feature class. In addition to this, you will use Python file manipulation techniques to read the coordinate data from a text file.
We will be importing the North American wildland fire incident data from a single day in October, 2007. This data is contained in a comma-delimited text file containing one line for each fire incident on this particular day. Each fire incident has a latitude, longitude coordinate pair separated by commas along with a confidence value. This data was derived by automated methods that use remote sensing data to derive the presence or absence of a wildfire. Confidence values can range from 0 to 100. Higher numbers represent a greater confidence that this is indeed a wildfire:
C:ArcpyBookCh8Wildfire DataNorthAmericaWildfire_2007275.txt
and examine the contents. You will notice that this is a simple comma-delimited text file containing the longitude and latitude values for each fire along with a confidence value. We will use Python to read the contents of this file line by line and insert new point features into the FireIncidents
feature class located in the C:ArcpyBookCh8 WildfireDataWildlandFires.mdb
personal geodatabase.
ArcCatalog
.C:ArcpyBookCh8WildfireData
.You should see a personal geodatabase called WildlandFires
. Open this geodatabase and you will see a point feature class called FireIncidents
. Right now, this is an empty feature class. We will add features by reading the text file you examined earlier and inserting points.
FireIncidents
and select Properties.The latitude/longitude values found in the file we examined earlier will be imported into the SHAPE
field and the confidence values will be written to the CONFIDENCEVALUE
field.
C:ArcpyBookCh8InsertWildfires.py
.arcpy
modules:import arcpy
arcpy.env.workspace = "C:/ArcpyBook/Ch8/WildfireData/WildlandFires.mdb"
f = open("C:/ArcpyBook/Ch8/WildfireData/NorthAmericaWildfires_2007275.txt","r") lstFires = f.readlines()
try
block:try:
InsertCursor
object using a with
block. Make sure you indent inside the try
statement. The cursor will be created in the FireIncidents
feature class:with arcpy.da.InsertCursor("FireIncidents",("SHAPE@XY","CONFIDENCEVALUE")) as cur:
cntr = 1
for
loop. Since the text file is comma-delimited, we'll use the Python split()
function to separate each value into a list variable called vals
. We'll then pull out the individual latitude, longitude, and confidence value items and assign them to variables. Finally, we'll place these values into a list variable called rowValue
, which is then passed into the insertRow()
function for the InsertCursor
object, and we then print a message:for fire in lstFires: if 'Latitude' in fire: continue vals = fire.split(",") latitude = float(vals[0]) longitude = float(vals[1]) confid = int(vals[2]) rowValue = [(longitude,latitude),confid] cur.insertRow(rowValue) print("Record number " + str(cntr) + " written to feature class") #arcpy.AddMessage("Record number" + str(cntr) + " written to feature class") cntr = cntr + 1
except
block to print any errors that may occur:except Exception as e: print(e.message)
finally
block to close the text file:finally: f.close()
import arcpy arcpy.env.workspace = "C:/ArcpyBook/Ch8/WildfireData/WildlandFires.mdb" f = open("C:/ArcpyBook/Ch8/WildfireData/NorthAmericaWildfires_2007275.txt","r") lstFires = f.readlines() try: with arcpy.da.InsertCursor("FireIncidents", ("SHAPE@XY","CONFIDENCEVALUE")) as cur: cntr = 1 for fire in lstFires: if 'Latitude' in fire: continue vals = fire.split(",") latitude = float(vals[0]) longitude = float(vals[1]) confid = int(vals[2]) rowValue = [(longitude,latitude),confid] cur.insertRow(rowValue) print("Record number " + str(cntr) + " written to feature class") #arcpy.AddMessage("Record number" + str(cntr) + " written to feature class") cntr = cntr + 1 except Exception as e: print(e.message) finally: f.close()
C:ArcpyBookcodeCh8InsertWildfires.py
solution file.Record number: 406 written to feature class Record number: 407 written to feature class Record number: 408 written to feature class Record number: 409 written to feature class Record number: 410 written to feature class Record number: 411 written to feature class
FireIncidents
feature class to the table of contents. The points should be visible, as shown in the following screenshot:Some additional explanation may be needed here. The lstFires
variable contains a list of all the wildfires that were contained in the comma-delimited text file. The for
loop will loop through each of these records one by one, inserting each individual record into the fire
variable. We also include an if
statement that is used to skip the first record in the file, which serves as the header. As I explained earlier, we then pull out the individual latitude, longitude, and confidence value items from the vals
variable, which is just a Python list object and assign them to variables called latitude
, longitude
, and confid
. We then place these values into a new list variable called rowValue
in the order that we defined when we created InsertCursor
. Thus, the latitude and longitude pair should be placed first followed by the confidence value. Finally, we call the insertRow()
function on the InsertCursor
object assigned to the cur
variable, passing in the new rowValue
variable. We close by printing a message that indicates the progress of the script and also create the except
and finally
blocks to handle errors and close the text file. Placing the file.close()
method in the finally
block ensures that it will execute and close the file even if there is an error in the previous try
statement.