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