Pkde Pkde - 3 months ago 40
Python Question

How to add data to the new column in existing CSV using Python script

Team,

2 things i am trying to do as per below code

1) write data in column 2,3,4 and 8 of file1 to a new file.

2) data in 1st column(copied in new file)should be searched file2. if found,pick the data in 3rd column of same row of file 2 and write the same to the new column of new file.

point 1 is working fine..finding issue in getting output as per 2nd point

import csv


f1 = csv.reader(open("C:/Users/file1.csv","rb"))
f2 = csv.writer(open("C:/Users/newfile.csv","wb"))
f3 = csv.reader(open("C:/Users/file2.csv","rb"))

for row in f1:

if not row[0].startswith("-"):

f2.writerow((row[1],row[2],row[3],row[7]))

var1 = row[1]

for row in f3:

if var1 in row:

f2.append(row[2])

Answer

I suspect that your re-use of the "row" variable name in the second for loop is clobbering the one held in "var1". I would always steer clear of that kind of recycling of variable names in nested loops.

for row_f1 in f1:

    if not row_f1[0].startswith("-"):

        f2.writerow((row_f1[1],row_f1[2],row_f1[3],row_f1[7]))

        var1 = row_f1[1]

        for row_f3 in f3:

            if var1 in row_f3:

                f2.append(row_f3[2])

However, I don't know that that append would do what you need, as f2 will have no append method, as far as I can see. From your use of .append, it looks like you wanted to put the elements from f1 into a list

for row_f1 in f1:

    if not row_f1[0].startswith("-"):

        temp_list = [row_f1[1],row_f1[2],row_f1[3],row_f1[7]]

        for row_f3 in f3:

            if temp_list[0] in row_f3:

                temp_list.append(row_f3[2])
        f2.writerow(temp_list]

Though your explanation of what you want to achieve isn't completely clear to me.

EDIT: I think Kristof's solution is far better, I was just trying to arrive at a solution that required minimal changes to your existing code. If you provided an example of what you expect your output to be with given inputs, that would definitely clarify things.