pythoncsv

csv.reader() is separating values by individual character


I have the following code trying to iterate over some items:

Here is the input (Single line)

operation,sku,item_name,upc,ean,brand_name

   filename=open("WebstoreItemTemplate.csv").read()
   template=csv.reader(filename,delimiter=',')
   for row in template:
        print row

I'm expecting the output to look the same, something like:

['operation','sku','item_name','upc,ean','brand_name']

instead I'm receiving the following output with each letter being treated as a list. I've verified that the file is in csv format, so I'm unsure what I'm doing wrong.

['o']
['p']
['e']
['r']
['a']
['t']
['i']
['o']
['n']
['', '']
['s']
['k']
['u']
['', '']
['i']
['t']
['e']
['m']
['_']
['n']
['a']
['m']
['e']
['', '']
['u']
['p']
['c']
['', '']
['e']
['a']
['n']
['', '']
['b']
['r']
['a']
['n']
['d']
['_']
['n']
['a']
['m']
['e']

Solution

  • Remove the .read and just pass the file object:

    with open("WebstoreItemTemplate.csv") as filename:
        template=csv.reader(filename)
        for row in template:
            print row
    

    Which will give you:

    ['operation', 'sku', 'item_name', 'upc', 'ean', 'brand_name']
    

    From the docs:

    csv.reader(csvfile, dialect='excel', **fmtparams)

    Return a reader object which will iterate over lines in the given csvfile. csvfile can be any object which supports the iterator protocol and returns a string each time its next() method is called — file objects and list objects are both suitable.

    Basically this is happening:

    In [9]: next(iter("foo"))
    Out[9]: 'f'