3.2.1 Accessing data fields
Before we get too deep into vector data access, it's going to be helpful to quickly review how the vector data is stored in the software. Vector features in ArcGIS feature classes (using this term to include shapefiles) are stored in a table. The table has rows (records) and columns (fields).
Fields in the table
Fields in the table store the geometry and attribute information for the features.
There are two fields in the table that you cannot delete. One of the fields (usually called SHAPE) contains the geometry information for the features. This includes the coordinates of each vertex in the feature and allows the feature to be drawn on the screen. The geometry is stored in binary format; if you were to see it printed on the screen, it wouldn't make any sense to you. However, you can read and work with geometries using objects that are provided with arcpy.
The other field included in every feature class is an object ID field (OBJECTID or FID). This contains a unique number, or identifier for each record that is used by ArcGIS to keep track of features. The object ID helps avoid confusion when working with data. Sometimes records have the same attributes. For example, both Los Angeles and San Francisco could have a STATE attribute of 'California,' or a USA cities dataset could contain multiple cities with the NAME attribute of 'Portland;' however, the OBJECTID field can never have the same value for two records.
The rest of the fields contain attribute information that describe the feature. These attributes are usually stored as numbers or text.
Discovering field names
When you write a script, you'll need to provide the names of the particular fields you want to read and write. You can get a Python list of field names using arcpy.ListFields().
# Reads the fields in a feature class import arcpy featureClass = "C:\\Data\\Alabama\\Alabama.gdb\\Cities" fieldList = arcpy.ListFields(featureClass) # Loop through each field in the list and print the name for field in fieldList: print field.name
The above would yield a list of the fields in the Cities feature class in a file geodatabase named Alabama. If you ran this script in PythonWin (try it with one of your own feature classes!) you would see something like the following in the Interactive Window.
>>> OBJECTID Shape UIDENT POPCLASS NAME CAPITAL STATEABB COUNTRY
Notice the two special fields we already talked about: OBJECTID, which holds the unique identifying number for each record, and Shape, which holds the geometry for the record. Additionally, this feature class has fields that hold the name (NAME), the state (STATEABB), whether or not the city is a capital (CAPITAL), and so on.
Arcpy treats the field as an object, therefore the field has properties that describe it. That's why you can print field.name. The help reference topic Using fields and indexes lists all the properties that you can read from a field. These include AliasName, Length, Type, Scale, Precision, and others.
Properties of a field are read-only, meaning that you can find out what the field properties are, but you cannot change those properties in a script using the Field object. If you wanted to change the scale and precision of a field, for instance, you would have to programmatically add a new field.