TypeError: cannot concatenate 'str' and 'NoneType' objects

Discussion in 'Python' started by thompson.marisa, Dec 20, 2006.

  1. Hi.

    I'm extremely new to Python and programming as a whole. I have written
    a python script with the assistance of ESRI ArcGIS 9.2, which uses
    Python 2.4.1, however, it gives me this error when I try to run it.
    I've already posted at ESRI support, and I was hoping that Python
    people could help me more.

    I hope there is something simple I could do to be able to define the
    object that it thinks is NoneType. Please when someone responds,
    please treat me as an absolute novice.

    Thank you,
    Marisa

    Here is my code:

    #
    ---------------------------------------------------------------------------
    # towntab92.py
    # Created on: Wed Dec 20 2006 11:09:59 AM
    # (generated by ArcGIS/ModelBuilder)
    # Created by Marisa Thompson
    #
    ---------------------------------------------------------------------------

    # Import system modules
    import sys, string, os, arcgisscripting

    # Create the Geoprocessor object
    gp = arcgisscripting.create()

    # Check out any necessary licenses
    gp.CheckOutExtension("spatial")

    # Load required toolboxes...
    gp.AddToolbox("C:/Program Files/ArcGIS/ArcToolbox/Toolboxes/Spatial
    Analyst Tools.tbx")

    # Define workspace
    gp.workspace = "F:/Marisa/inputfolder"

    # Define Variables
    raster = "F:/Marisa/outputfolder_72/mss-72-spf.img"

    #Get list of Town Shapefiles
    Townshp = gp.ListFeatureClasses ("*")

    #Store path to output folder
    outputPath = "F:/Marisa/outputfolder_72"

    # Begin going through the loop
    Townshp = Townshps.next()
    while Townshps !="":
    #Set the output name to be the same as input
    outName = outputPath + "/" + Townshp + "land" + ".img"
    Output_table = outputPath + "/" + Townshp + "table" + ".dbf"
    #For each extract by Mask
    gp.ExtractbyMask_sa (raster, Townshp, outName)
    #For each tabluate area
    gp.TabulateArea_sa (Townshp, "RITOWN5K_", outName, "VALUE",
    Output_table, "98.425")
    Townshp = Townshps.next()
     
    thompson.marisa, Dec 20, 2006
    #1
    1. Advertisements

  2. that would be the None object.

    http://effbot.org/pyref/None

    which is often used as a placeholder in Python.

    my guess is that it's the next() call that returns None when you've
    reached the end of the shapefile list; try changing

    while Townshps !="":

    to

    while Townshps is not None:

    and see if the problem goes away.

    if you still get an exception, please post the full traceback; see

    http://effbot.org/pyfaq/tutor-i-need-help-im-getting-an-error-in-my-program-what-should-i-do

    for details.

    </F>
     
    Fredrik Lundh, Dec 20, 2006
    #2
    1. Advertisements

  3. thompson.marisa

    Mark Peters Guest

    # Begin going through the loop
    Warning: I know nothing about the Python ArcGIS stuff.

    The first thing that jumps out at me is your while condition. You are
    testing "Townshps" when it seems from the code that you should be
    testing "Townshp". However, the typical Python way to iterate through
    a list for be to use a for loop.
    Perhaps replace the while statement with:
    for Townshp in Townshps:
    and remove the "Townshp = Townshps.next()" lines

    If that doesn't do it, please post the entire traceback message that
    you are seeing (copy and paste it) and it should tell us a lot more
    about your error.
     
    Mark Peters, Dec 20, 2006
    #3
  4. Actually those will both lead to an infinite loop, since you're
    comparing the entire list, which is unlikely to ever become "" or None.
    You should compare Townshp, not Townshps, to "" or None, whichever
    the .next() method actually returns to signal the end of the list.

    Then again, I have the sneaking suspicion that you didn't post the
    actual code that you're running. The code you posted looks like it
    should raise a NameError in the line that says "Townshp =
    Townshps.next()".

    -Carsten
     
    Carsten Haese, Dec 20, 2006
    #4
  5. or rather,

    while Townshp is not None:

    since that's the variable you're using later on.

    </F>
     
    Fredrik Lundh, Dec 20, 2006
    #5
  6. that assumes that the feature class list is actually a Python iterable,
    of course, and not just something that happens to have a "next" method.

    :::

    .... and judging from the documentation

    http://webhelp.esri.com/arcgisdesktop/9.1/index.cfm?TopicName=ListFeatureClasses method

    it's not an iterable.

    :::

    you could of course replace the

    fcs = gp.ListFeatureClasses()
    fc = fcs.next()
    while fc:
    ...
    fc = fcs.next()

    pattern with

    for fc in iter(gp.ListFeatureClasses().next, None):
    ...

    but maybe that's a bit too clever for an absolute novice ;-)

    </F>
     
    Fredrik Lundh, Dec 20, 2006
    #6
  7. I was considering suggesting this, but I'm not sure there is much hope
    that this would work. The posted code suggests that Townshps.next()
    returns "" or None when the end of the list is reached. In order for the
    for loop to work, it would have to raise StopIteration instead. (I
    suppose it is conceivable that iter(Townshps) would return an object
    that does behave in the required manner, but I wouldn't bet a lot of
    money on that.)

    Of the course if Townshps does not support the iteration protocol, the
    for loop could still be written using the iter(callable,sentinel)
    pattern, but let's not confuse this poor newbie more than necessary ;)

    -Carsten
     
    Carsten Haese, Dec 20, 2006
    #7
  8. a écrit :
    Please post the full traceback. It's meant to help finding out what went
    wrong, you know...
    That's certainly not the solution...
    1/ where does this "Townshps" comes from ?
    2/ naming conventions are to use either all_lower (preferred) or at
    least mixedCase names for variables. And by all mean be consistent.
    3/ if Townshp is a shortcut for Township, then it would be better to
    keep the full word
    4/ the Python 'for' loop is meant to iterate over an iterable and taking
    care of boundaries, so you'd be better using it:

    townships = gp.ListFeatureClasses ("*")
    for township in townships:
    doSomethingWith(township)
     
    Bruno Desthuilliers, Dec 20, 2006
    #8
  9. Bruno Desthuilliers a écrit :
    Actually, forget the for loop (cf Fredrik's post - looks like
    gp.ListFeatureClasses() doesn't return an iterable...)
     
    Bruno Desthuilliers, Dec 20, 2006
    #9
  10. I've had a lot of replies suggesting different things. These are the
    results:

    When I change

    while Townshps !="": to
    while Townshp is not None:

    and when I change

    while Townshps !="": to
    for Townshp in iter(gp.ListFeatureClasses().next, None):

    They both work perfectly, and it solved my problem.

    Thank you all so much.
    Marisa
     
    thompson.marisa, Dec 20, 2006
    #10
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.