2017-07-16 196 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,您可以看到存儲的內容。