glayne
glayne

Reputation: 175

Add a new column to a csv file in python

I am trying to add a column to a csv file that combines strings from two other columns. Whenever I try this I either get an output csv with only the new column or an output with all of the original data and not the new column.

This is what I have so far:

with open(filename) as csvin:
    readfile = csv.reader(csvin, delimiter=',')
    with open(output, 'w') as csvout:
        writefile = csv.writer(csvout, delimiter=',', lineterminator='\n')
        for row in readfile:
            result = [str(row[10]) + ' ' + str(row[11])]
            writefile.writerow(result)

Any help would be appreciated.

Upvotes: 2

Views: 10608

Answers (3)

roganjosh
roganjosh

Reputation: 13175

No input to test, but try this. Your current approach doesn't include the existing data for each row that already exists in your input data. extend will take the list that represents each row and then add another item to that list... equivalent to adding a column.

import csv
with open(filename) as csvin:
    readfile = csv.reader(csvin, delimiter=',')
    with open(output, 'w') as csvout:
        writefile = csv.writer(csvout, delimiter=',', lineterminator='\n')
        for row in readfile:
            row.extend([str(row[10]) + ' ' + str(row[11])])
            writefile.writerow(row)

Upvotes: 2

Gopi Vinod Avvari
Gopi Vinod Avvari

Reputation: 294

Below code snippet combines strings in column 10 and column 11 in each row and add that to the end of the each row

import csv
input = 'test.csv'
output= 'output.csv'
with open(input, 'rb') as csvin:
    readfile = csv.reader(csvin, delimiter=',')
    with open(output, 'wb') as csvout:
        writefile = csv.writer(csvout, delimiter=',', lineterminator='\n')
        for row in readfile:
            result = row + [row[10]+row[11]]
            writefile.writerow(result)

Upvotes: 0

Hai Vu
Hai Vu

Reputation: 40723

I assume that glayne wants to combine column 10 and 11 into one. In my approach, I concentrate on how to transform a single row first:

def transform_row(input_row):
    output_row = input_row[:]
    output_row[10:12] = [' '.join(output_row[10:12])]
    return output_row

Once tested to make sure that it works, I can move on to replace all rows:

with open('data.csv') as inf, open('out.csv', 'wb') as outf:
    reader = csv.reader(inf)
    writer = csv.writer(outf)
    writer.writerows(transform_row(row) for row in reader)

Note that I use the writerows() method to write multiple rows in one statement.

Upvotes: 2

Related Questions