Python比较两个csv文件

时间:2017-07-16 19:29:30

标签: python csv

我有2个csv文件,我需要比较数据(对于1.csv中的每个名称和2.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的ID和Names列附加到输出文件

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)

1 个答案:

答案 0 :(得分:0)

您可能需要先将1读入Python词典,然后在阅读1.csv时可以使用它来查找值。这样可以避免尝试阅读2.csv中每一行的1.csv

2.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 将文件指针移回到开头,但更好的方法是避免重复读取文件,并将所需的所有值存储在Python字典中。尝试添加seek(),您就可以看到存储的内容了。