Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

csv.reader() is separating values by individual character

Tags:

python

csv

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']
like image 576
Ben C Wang Avatar asked Jul 04 '15 21:07

Ben C Wang


People also ask

What does the delimiter argument in the CSV reader () function do?

Optional Python CSV reader Parameters delimiter specifies the character used to separate each field. The default is the comma ( ',' ).


2 Answers

You just need to call splitlines() after calling read. Passing the file object is not always ideal or required.

For example reading from string:

import csv
rawdata = 'name,age\nDan,33\nBob,19\nSheri,42'
myreader = csv.reader(rawdata.splitlines())
for row in myreader:
    print(row[0], row[1])

in my case I just wanted to detect encoding using chardet:

with open("WebstoreItemTemplate.csv") as f:
     raw_data = f.read()
     encoding = chardet.detect(raw_data)['encoding']
     cr = csv.reader(raw_data.decode(encoding).splitlines())
...

Here are some practical examples that I have personally found useful: http://2017.compciv.org/guide/topics/python-standard-library/csv.html

like image 193
Andreas Avatar answered Nov 07 '22 18:11

Andreas


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'
like image 43
Padraic Cunningham Avatar answered Nov 07 '22 18:11

Padraic Cunningham