我有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)
答案 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()
,您就可以看到存储的内容了。