2017-07-16 12 views
-4

Ich habe 2 csv-Dateien, ich muss die Daten vergleichen (für jeden Namen in 1.csv mit vollständigen Array von Namen in 2.csv und fügen Sie Daten in das folgende Format in neue Ausgabedatei.Python vergleichen zwei CSV-Dateien

1.csv

ID | Name | Fee 

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

123 |abc |110 

234 |xyz |160 

2.csv (enthält nULL-Werte in-Name)

---------- 
|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 

Für Erstinbetriebnahme, dachte an die Ausgabedatei mit den Werten abgeglichen mit 1.csv schreiben und dann die ID und Namen Spalten von 1.csv in die Ausgabedatei

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

Willkommen bei StackOverflow. Bitte nimm dir die Zeit, um durch die [Tour] zu gehen und dein erstes Abzeichen zu verdienen. Leider ist SO kein Code-Schreibdienst. Bitte zeigen Sie uns, was Sie getan haben und wo Sie stecken geblieben sind. Wir helfen Ihnen gerne. –

+0

unten ist der Code – prakhash

+0

Nein Nein Nein Nein Nein Nein Nein. Es geht in Ihrem Beitrag, nicht in den Kommentaren. –

Antwort

0

Sie müssen wahrscheinlich Anhängen an erster Lies in 1.csv in ein Python-Wörterbuch, mit dem du dann Werte lesen kannst, während du 2.csv liest. Dadurch wird vermieden, 1.csv für jede Zeile in 2.csv zu lesen.

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]]) 

Geben Sie output.csv wie folgt:

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

Der Grund Ihren Ansatz ein zweites Mal zur Arbeit versagt ist, dass Sie die Datei von der Spitze jedes Mal durch die Schleife starten müsste lesen. Derzeit wird es einfach bis zum Ende gelesen und gibt Ihnen dann beim zweiten Mal keine Zeilen mehr. Sie können die Datei entweder schließen und erneut öffnen oder den Dateizeiger mithilfe von seek() an den Anfang zurückversetzen. Besser ist es jedoch, das wiederholte Lesen von Dateien zu vermeiden und alle benötigten Werte in einem Python-Wörterbuch zu speichern. Versuchen Sie print data_f1 hinzuzufügen und Sie können sehen, was gespeichert ist.