Take the 2-minute tour ×
Geographic Information Systems Stack Exchange is a question and answer site for cartographers, geographers and GIS professionals. It's 100% free, no registration required.

I have multiple shapefiles to which I have added a field called "gname1". For each shapefile, I want "gname1" to be set to the name of that particular shapefile, for every feature within the shapefile. I realize there are multiple ways to do this, but I want to know how to do this within the "Field Calculator" tool. So, in the "gname1=" box under Field Calculator, what is the expression I use to denote that I want the field to be set to the shapefile name?

I am very new to python, and not entirely familiar with the procedure for using python scripts to calculate fields through this tool in Arc10. I have seen other questions similar to this one, but I was confused on how to do this within the field calculator tool. Thanks for any help!

share|improve this question
    
Thank you so much!!!! I had a similar problem, could not find an example of calculate field management with a shapefile untill this... My error was not putting the "'" around my variable in the expression!!!! Thank you!!! Saved me hours of work! –  user13447 Dec 10 '12 at 14:48

3 Answers 3

If you open the python interpreter window you can do this pretty easily.

First you'll need a list of your shapefiles. You can get this by returning it from the data frame. So you'll need to have an MXD with all your shapefiles on it. Then in the python interpreter type the following:

mxd = arcpy.mapping.MapDocument("Current") #Returns your mxd
layerlist = arcpy.mapping.ListLayers(mxd)  #Returns your list of layer

That will produce a list of all your layers. Now we need to create a loop that will go through all the layers, find their name that add it to the field.

x = 0
while x < len(layerlist):                  #While x is less than the number of layers you have
    layer = layerlist[x]
    desc = arcpy.describe(layer)           #Describe a layer in the layer list
    layername = str(desc.name)             #Get the layer name
    expression = "'" + layername + "'"     #Setup the calculator expression
    arcpy.CalculateField_management (layer, "gname1", expr, "PYTHON_9.3", "#")
    x = x + 1

This will do what your looking for, but since your new at python it's going to seem pretty daunting and may be a little tricky. So if you have some questions post them and I'll try to help.

share|improve this answer

If you're committed to using the Field Calculator tool your best bet may be a very short python script within the "Pre-Logic Script Code":

def listShpName(yourShp):
  desc=arcpy.Describe(yourShp)
  return desc.Name

...and then your expression will be

listShpName("LayerInArcMapToC") 

Where LayerInArcMapToC is the name of your layer in ArcMap

I've attached a screen capture to illustrate this. Of course, you'll have to do this on a shapefile-by-shapefile basis if you want to use field calculator. Here's a link to the ESRI documentation on describing data like I've illustrated above: http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//002z00000018000000

An additional link to some simple field calculator operations: http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//005s0000002m000000

enter image description here

share|improve this answer

I know nothing about Python, this is my first attempt at even trying it, but Cody's code didn't work for me. I fiddled with it a bit and this is what ended up working.

mxd = arcpy.mapping.MapDocument("Current")
layerlist = arcpy.mapping.ListLayers(mxd)

x = 0
while x < len(layerlist):                  
    layer = layerlist[x]
    layername = str(layer.name)             
    expression = "'" + layername + "'"
    arcpy.AddField_management(layer, "identify", "TEXT")
    arcpy.CalculateField_management (layer, "identify", expression, "PYTHON_9.3", "#")
    x = x + 1

The result was a new field in each layer, named "identify", which identified the name of its layer. You shouldn't have to edit any of the code, unless you want to call your column something different (then edit "identify" in the Addfield and Calculatefield bits to whatever you want it to be).

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.