Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to read a csv file with python

Tags:

python

csv

I'm trying to read a csv file but it doesn't work. I can read my csv file but when I see what I read, there where white space between values.

Here is my code

# -*- coding: iso-8859-1 -*-
import sql_db, tmpl_macros, os
import security, form, common

import csv

class windows_dialect(csv.Dialect):
    """Describe the usual properties of unix-generated CSV files."""
    delimiter = ','
    quotechar = '"'
    doublequote = 1
    skipinitialspace = 0
    lineterminator = 'n'
    quoting = csv.QUOTE_MINIMAL


def reco(d):
 cars = {210:'"', 211:'"', 213:"'", 136:'à', 143:'è', 142:'é'}
 for c in cars:
  d = d.replace(chr(c),cars[c])
 return d

def page_process(ctx):
 if ctx.req_equals('catalog_send'):
  if 'catalog_file' in ctx.locals.__dict__:
   contenu = ctx.locals.catalog_file[0].file.read()
   #contenu.encode('')
   p = csv.reader(contenu, delimiter=',')
   inserted = 0
   modified = 0
   (cr,db) = sql_db.cursor_get()
   for line in p:
    if line:
     logfile = open('/tmp/test.log', 'a')
     logfile.write(line[0])
     logfile.write('\n')
     logfile.write('-----------------------------\n')
     logfile.close()
like image 892
john Avatar asked Oct 20 '09 08:10

john


2 Answers

I prefer to use numpy's genfromtxt rather than the standard csv library, because it generates numpy's recarray, which are clean data structures to store data in a table-like object.

>>> from numpy import genfromtxt
>>> data = genfromtxt(csvfile, delimiter=',', dtype=None)
# data is a table-like structure (a numpy recarray) in which you can access columns and rows easily
>>> data['firstcolumn']
<content of the first column>

EDIT: This answer is quite old. While numpy.genfromtxt, nowadays most people would use pandas:

>>> import pandas as pd
>>> pd.read_csv(csvfile)

This has the advantage of creating pandas.DataFrame, which is a better structure for data analysis.

like image 138
dalloliogm Avatar answered Oct 18 '22 23:10

dalloliogm


If you have control over the data, use tab-delimited instead::

import csv
import string

writer = open('junk.txt', 'wb')
for x in range(10):
    writer.write('\t'.join(string.letters[:5]))
    writer.write('\r\n')
writer.close()
reader = csv.reader(open('junk.txt', 'r'), dialect='excel-tab')
for line in reader:
    print line

This produces expected results.

A tip for getting more useful feedback: Demonstrate your problem through self-contained and complete example code that doesn't contain extraneous and unimportant artifacts.

like image 21
Mark McEahern Avatar answered Oct 19 '22 01:10

Mark McEahern