Hey everyone. I would really appreciate some help. I'm currently building a program in Python 2.6 for an introductory Comp Sci class. The program is supposed to use functions to read a text file from a URL, parse the data into tokens, and use the data to calculate a sort of average 'course grade' for hypothetical students using the URL data.

This is all something I've done before, only I didn't use functions. Now that I'm using them, I'm running into errors and need help.

Specifically, when I try to run the program I get an error like this:

Traceback (most recent call last):
  File "C:\Users\Denis Walker\Documents\CSM\CSCI 101\CourseGradeFunctions.py", line 35, in <module>
    for li in lines[1:] :
TypeError: 'NoneType' object is unsubscriptable

Here is the code for what I have so far.

theURL = "http://inside.mines.edu/~khellman/teaching/csci101/qo/coursegrades.dat"

def download(theURL):
    import urllib2
    urlConnection = urllib2.urlopen( theURL )
    lines = urlConnection.readlines()
    print lines
def parse(li):
    theLine = lines[li]
    theTokens = theLine.split()
    theValues = []
    theValues.append( theTokens[0] )
    t = 1
    while t < len(theTokens) :
        theValues.append( float( theTokens[t] ) )
        t = t + 1

def courseGrade():
    CWID = theValues[0]
    fi = theValues[1]
    a = theValues[2]
    b = theValues[3]
    p = theValues[4]
    q = theValues[5]
    t = theValues[6]
    c = (p*.2 + q*.1 + a*.15 + b*.2 + fi*.25 + t*.1)
    print c
def printStudent( outfile, cg, scores ):
    f = file( "FunctionCourseGrades.txt", "a" )
    f.write("%-s %10.2f %10.2f %10.2f %10.2f %10.2f %10.2f %10.2f\n" % (CWID, c, fi, a, b, p, q, t))

lines = download(theURL)
for li in lines[1:] :
    scores = parse(1)
    cg = courseGrade(scores)
    printStudent( f, cg, scores )

print "Please open FunctionCourseGrades.txt to see the listed scores including calculated course grades."
6 Years
Discussion Span
Last Post by Torien7

Your download function doesn't contain a return statement, which means that it doesn't return a value. So when you execute line 34, the variable "lines" is set to None. In line 35, when you try to select elements of Lines, the Python system tells you that you can't select elements of None.

If your goal is for download to return the value of the local variable "lines," which is completely distinct from the variable "lines" in line 34 of your program, then you need to put

return lines

at the end of your download function (appropriately indented, of course).

Votes + Comments
on target
good point
This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.