2017-07-16 163 views
-4

我有2个csv文件,我需要比较数据(1.csv中的每个名称与2.csv中完整的名称数组并将数据以下面的格式插入到新的输出文件中)Python比较两个csv文件

1.csv

ID | Name | Fee 

------|------|------ 

123 |abc |110 

234 |xyz |160 

2.csv(包含名称为空值)

---------- 
|Name |S1 |S2 

abc |60 |50 

abc |30 |40 

xyz |70 |90 

ouput.csv

---------- 
|ID |S1 |S2 |Name |Fee 

123 | | |abc | 

123 |60 |50 |  |110 

123 |30 |40 |  |110 

234 | | |xyz | 

234 |70 |90 |  |160 

对于初始启动,写作与1.csv匹配值的输出文件,然后附加标识和名称1.csv列到输出文件的思想

reader1 = csv.reader(open('1.csv','rb')) 
reader2 = csv.reader(open('2.csv','rb')) 
writer = csv.writer(open('output.csv','wb')) 
for row1 in reader1: 
    for row2 in reader2: 
     if row1[1] == row2[0]: 
      data = [row1[1],row2[1],row2[2],row1[2] 
      print data 
      writer.writerow(data) 
+2

欢迎来到StackOverflow。请花时间浏览[导览]并赢取您的第一张徽章。不幸的是,SO不是代码写入服务。请告诉我们你做了什么以及你卡在哪里。我们很乐意提供帮助。 –

+0

下面是代码 – prakhash

+0

不,不不不不不不不不不不不不不,不,它在你的文章中,而不是在评论中。 –

回答

0

你可能需要先在1.csv中读入Python字典,然后在阅读2.csv时可以使用它查找值。这样可以避免在2.csv中为每行读取1.csv

import csv 

data_f1 = {}  # hold all of 1.csv in this dictionary 

with open('1.csv', 'rb') as f_1: 
    csv_f1 = csv.reader(f_1) 
    header_f1 = next(csv_f1) 

    for row in csv_f1: 
     data_f1[row[1]] = [row[0], row[2]] 

with open('2.csv', 'rb') as f_2, open('output.csv', 'wb') as f_output: 
    csv_f2 = csv.reader(f_2) 
    header_f2 = next(csv_f2) 
    csv_output = csv.writer(f_output) 
    csv_output.writerow(['ID', 'S1', 'S2', 'Name', 'Fee']) 

    for row in csv.reader(f_2): 
     f1 = data_f1[row[0]] 
     csv_output.writerow([f1[0], '', '', row[0], '']) 
     csv_output.writerow([f1[0], row[1], row[2], f1[1]]) 

给你output.csv如下:

ID,S1,S2,Name,Fee 
123,,,abc, 
123,60,50,110 
123,,,abc, 
123,30,40,110 
234,,,xyz, 
234,70,90,160 

你的做法是无法正常工作第二次的原因是,你需要开始通过循环从顶部每次读取文件。目前它只会读到最后,然后在第二次尝试时再给你一行。您可以关闭并重新打开该文件,也可以使用seek()将文件指针移回开头,但更好的方法是避免重复读取文件,并将所需的所有值存储在Python字典中。尝试添加print data_f1,您可以看到存储的内容。