[Tutor] [Errno 9] Bad file descriptor

Khalid Al-Ghamdi emailkgnow at gmail.com
Tue Dec 1 05:07:07 CET 2009


Hi everybody,

I'm running python 2.6.1 on vista and I'm trying to use the csv module to
write to a csv file and get the average of some numbers, but I keep getting
the following error:

Traceback (most recent call last):
  File "C:\Python31\MyCSVProjectFinal.py", line 83, in <module>
    writer.writerow(headings)
IOError: [Errno 9] Bad file descriptor

line 83 refers to the following code, specifically to the one in capital (in
the actual code it's not in capital by the way):

headings = linesInCSV[0] # e.g. ['Measured1', 'Measured2']
    csvOutFileName = easygui.filesavebox(title = "Choose output file for
averages", )
    if csvOutFileName is not None:
        print "Saving using: "+csvOutFileName
        csvOut = file(csvOutFileName, 'rb')
        writer = csv.writer(csvOut)
*        WRITER.WRITEROW(HEADINGS)*
        for index in range(len(measured1)):
            writer.writerow([measured1[index], measured2[index]])
        writer.writerow([averaged1, averaged2])
    else:
        print "No filename for saving"


so, my problem is I don't know why it keeps giving me this error. I've
checked on the internet, but I haven't found anything to help resolve this
error.

I hope you can be of help.

PS: I've added the complete code below for reference.

thanks


import csv
import sys
import easygui

def getFileAndPath():
    "Get fully-qualified path to the csv file"
    # TODO argInitialFile = '*.csv'
    fileAndPath = easygui.fileopenbox(title="Select .CSV file")
    print "Using:",fileAndPath
    return fileAndPath

def getLinesInCSVFile(fileAndPath):
    "read lines in CSV file, return a list of these lines"
    linesInCSV = []
    reader = csv.reader(open(fileAndPath, "rb"))
    for row in reader:
        linesInCSV.append(row)
    return linesInCSV

def justNumbers(listOfStrings):
    "True if the list contains just numbers represented as strings"
    # e.g. ['22.4', '23.9']
    isJustNumbers = True
    for item in listOfStrings:
        try:
            nbr = float(item)
        except ValueError:
            isJustNumbers = False
    return isJustNumbers

def getNumbers(listOfStrings):
    "Convert a list of strings-of-numbers to a list of numbers, e.g.
['22.4', '23.9'] -> [22.4, 23.9]"
    numbers = []
    for item in listOfStrings:
        nbr = float(item)
        numbers.append(nbr)
    return numbers

def average(values):
    """Computes the arithmetic mean of a list of numbers"""
    return sum(values, 0.0) / len(values)

if __name__ == "__main__":
    # get the file-name
    #fileAndPath = getFileAndPath()
    # NOTE quick hack to make our test/development process quicker
    fileAndPath = "c:\\testing\\measured2.csv"

    # read the CSV file
    linesInCSV = getLinesInCSVFile(fileAndPath)

    measured1 = []
    measured2 = []
    for n in range(1,4):
        line = linesInCSV[n]
        isJustNumbers = justNumbers(line)
        if not isJustNumbers:
            print "ERROR!  Expected a line of numbers, instead we got:",line
            sys.exit()
        # we only get here if justNumbers reports that we only have numbers

        # so we can extract the list of floating-point numbers
        numbers = getNumbers(line)
        measured1.append(numbers[0])
        measured2.append(numbers[1])
    averaged1 = average(measured1)
    averaged2 = average(measured2)

    # Show values of Measured1 in a choicebox
    # We don't care about the choices, this is just for output
    #easygui.choicebox(message = "Sorted values in Measured1", title =
"Measured1", choices = measured1)

    headings = linesInCSV[0] # e.g. ['Measured1', 'Measured2']
    csvOutFileName = easygui.filesavebox(title = "Choose output file for
averages", )
    if csvOutFileName is not None:
        print "Saving using: "+csvOutFileName
        csvOut = file(csvOutFileName, 'rb')
        writer = csv.writer(csvOut)
        writer.writerow(headings)
        for index in range(len(measured1)):
            writer.writerow([measured1[index], measured2[index]])
        writer.writerow([averaged1, averaged2])
    else:
        print "No filename for saving"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20091201/fc1998fb/attachment.htm>


More information about the Tutor mailing list