table from csv file

Jon Clements joncle at googlemail.com
Fri Jan 8 13:55:55 EST 2010


On Jan 8, 5:59 pm, marlowe <marlowequ... at hotmail.com> wrote:
> I am trying to create a table in python from a csv file where I input
> which columns I would like to see, and the table only shows those
> columns. I have attached an example of the csv file i am using, and
> some of the code I have written. I am having trouble converting
> variables between lists, dictionaries and tuples. Is there a name for
> what I am attempting to do? any help to get me on the right track with
> this is appreciated.
>
> test.csv
> Date    Open     High    Low    Close   Volume  Adj Close
> 12/14/09        110.01  110.7   109.5   110.24  16316000        110.24
> 12/11/09        110.6   110.82  108.72  109.32  28983100        109.32
> 12/10/09        110.66  111.03  110.04  110.82  20491700        110.82
> 12/9/09 111.6   112.48  109.38  110.84  37104900        110.84
> 12/8/09 112.76  113.06  110.21  110.95  37630800        110.95
> 12/7/09 111.51  114.22  111.44  113.11  42480500        113.11
> 12/4/09 117.15  117.26  112.41  113.75  79182600        113.75
> 12/3/09 118.57  119.54  118.03  118.7   28802100        118.7
> 12/2/09 118.8   119.27  118.3   119.18  30994600        119.18
> 12/1/09 117.3   117.93  116.78  117.38  27641000        117.38
> 11/30/09        114.48  115.89  114.27  115.64  16402300        115.64
> 11/27/09        113.08  115.81  113.02  115.06  21234400        115.06
> 11/25/09        115.69  116.88  115.53  116.62  24553300        116.62
> 11/24/09        114.73  114.81  113.97  114.73  22599700        114.73
> 11/23/09        114.67  115.12  113.99  114.29  24422700        114.29
> 11/20/09        111.74  112.94  111.54  112.94  17302500        112.94
> 11/19/09        111.85  112.4   110.76  112.3   21239800        112.3
> 11/18/09        112.69  113.09  111.8   112.25  22320600        112.25
> 11/17/09        111.09  111.99  110.9   111.97  19732900        111.97
> 11/16/09        110.7   112.16  110.65  111.63  25002300        111.63
> 11/13/09        108.32  109.8   108.14  109.74  17246000        109.74
> 11/12/09        109.16  109.56  108.12  108.21  17848300        108.21
> 11/11/09        109.49  109.71  109     109.6   17654100        109.6
> 11/10/09        108.03  108.78  107.7   108.39  15973300        108.39
> 11/9/09 108.69  108.75  107.91  108.19  18444800        108.19
> 11/6/09 107.38  108.04  107.06  107.43  14789000        107.43
> 11/5/09 106.81  107.2   106.6   106.98  10189000        106.98
> 11/4/09 107.11  107.68  106.43  107.1   27125500        107.1
>
> table.py;
>
> import csv
>
> (D, O, H, L, C, V, A) = (11, 'open', 'high', 'low', 'close', 66, 77)
>
> d = {'high':H, 'low':L, 'close':C, 'open':O}
>
> spacing = '%-*s'
>
> w=raw_input('what do you want to see? (use commas to seperate values)
> ')
> y=w.lower()
> x=y.replace(' ','')
> print x
>
> p = x.split(',')                    #this takes string, converts to
> list
> print p
> num = len(p)
> format = num*spacing
> width = 12*num
> wi = 12
> secwidth = width - wi
>
> bb = []
> i=0
> while i < num:                      #creates new list with variables
>     ll = d[p[i]]
>     bb.insert(i,ll)
>     i+=1
> print bb
> i = 0
> while i < num:
>     bb.insert(i*2, 12)               #this works on list
>     i+=1
> print bb
>
> i = 0
> while i < num:
>     p.insert(i*2, 12)               #this works on list
>     i+=1
>
> q = tuple (p)                       #takes list, converts to tuple
>
> reader = csv.reader(open('/prog/test.csv', "rb"))
>
> rownum = 0
> for row in reader:
>     if rownum == 0:
>         print '=' * width
>         print format % (q)
>         print '-' * width
>         print ''
>
>     else:
>         D, O, H, L, C, V, A = row [:7]
>         o = tuple (bb)
>         print format % (o)
>
>     rownum += 1

This might be a useful starting point (I'm guessing this is what
you're after...)

Let's assume your 'CSV' file is tab separated as it's certainly not
comma separated :)

import csv
csvin = csv.reader(open('test.csv'), delimiter='\t')
header = dict( (val.strip(),idx) for idx, val in enumerate(next
(csvin)) )

We can use header as a column name->column index lookup eg header
['Open'] == 1

from operator import itemgetter
wanted = ['Open', 'Close'] # Although you'll want to use raw_input and
split on ','
getcols = itemgetter(*[header[col] for col in wanted])

getcols is a helper function that'll return a tuple of the columns in
the requested order...

for row in csvin:
    print getcols(row)

Loop over the rest of the file and output the required columns.


hth
Jon.








More information about the Python-list mailing list