Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Looping through columns in a .csv files in Python

Tags:

python

csv

sum

I want to be able to use Python to open a .csv file like this:

5,26,42,2,1,6,6

and then perform some operation on them like addition.

total = 0
with open("file.csv") as csv_file:
        for row in csv.reader(csv_file, delimiter=','):
            for number in range(7):
                total += int(row[number]) 

The problem is that since the .csv file only has one row and an unknown number of columns, I don't know how to make this work without either hard-coding it like or using really ugly code.

Is there any way of looping through the columns using something like for columns in file in Python?

like image 582
Iceland_jack Avatar asked Mar 16 '10 18:03

Iceland_jack


2 Answers

You can just say

for col in row:
    total += int(col)

For example:

import csv
from StringIO import StringIO

total = 0
for row in csv.reader(StringIO("1,2,3,4")):
    for col in row:
        total += int(col)

print total    # prints 10

The reason why you can do this is that csv.reader returns a simple list for every row, so you can iterate over it as you would any other list in Python.

However, in your case, since you know that you have a file with a single line of comma-separated integers, you could make this much simpler:

line = open("ints.txt").read().split(",")
total = sum(int(i) for i in line)
like image 79
Eli Courtwright Avatar answered Sep 29 '22 16:09

Eli Courtwright


You can iterate over a list of columns just as you iterate over the rows in a csv reader:

total = 0
with open("file.csv") as csv_file:
   for row in csv.reader(csv_file, delimiter=','):
        for col in row:
            total += int(col)

Or you can add the sum of each row on each pass, and skip the inside loop:

total = 0
with open("file.csv") as csv_file:
   for row in csv.reader(csv_file, delimiter=','):
        total += sum(map(int, row))

Or you can save creating an extra list by using itertools.imap instead of map.

like image 33
jcdyer Avatar answered Sep 29 '22 16:09

jcdyer