2016-06-06 10 views
0

Ich versuche, die ersten 300 Zeilen einer csv-Datei mit einer anderen zu vergleichen. Ich wiederhole jede Zeile der ersten Datei. Innerhalb dieser Iteration durchlaufe ich die zweite Datei und zähle jede Iteration, bis ich eine Übereinstimmung finde. Dann gebe ich den Zählwert (Zeile der übereinstimmenden Zeile in der zweiten Datei) in eine Textdatei aus.Vergleichen CSV-Dateien Rangfolge

Hier ist, was ich bisher:

import csv 

with open('/Volumes/cachannel/CUTLER/subsampling/in-silico_IDC18_GFP18_names_only.csv', 'rb') as file1: 
    file1reader = csv.reader(file1) 
    with open('/Volumes/cachannel/CUTLER/subsampling/ICD18_GFP18_names_only.csv', 'rb') as file2: 
     file2reader = csv.reader(file2) 

     header1 = file1reader.next() 
     header2 = file2reader.next() 

     count = 0 

     with open("Rank_results.txt", 'a') as outfile: 
      while count < 300: 
       print(count) 
       for line1 in file1reader: 
        linenum = 1 
        for line2 in file2reader: 
         if line1 == line2: 
          print('match found') 
          outfile.write(str(linenum)) 
         else: 
          linenum += 1 
       count += 1 

Der Fehler, den ich jetzt bin immer ist, dass es nur das erste Spiel findet und keine anderen nicht findet - wenn ich weiß, gibt es mehr.

Gerade hier klar zu sein, ist ein Beispiel:

Datei 1:

Bob 
Sue 
Sally 
Herald 

File 2:

Sue 
Bob 
Herald 
Sally 

Ausgabedatei:

2 1 4 3 
+0

Sie immer 1 drucken gehen, da Sie nie die linenum Variable aktualisieren –

+0

ich den Code aktualisiert ein Update auf die linenum Variable enthalten, wenn ein Match wird nicht gefunden, aber immer noch kein Glück ... – Labrat

+0

Wenn ich Ihren Code ausführen, bekomme ich eine leere 'Rank_results.txt' Datei als Ergebnis und es wird nie' match found' ausgedruckt. – martineau

Antwort

1

Ihr Hauptproblem versucht über t zu iterieren Die zweite Datei mehrmals. Um den gesamten Inhalt mehrmals zu durchlaufen, müssen Sie ihn schließen und erneut öffnen. Sie können Python auch erlauben, die Zeilennummern automatisch zu zählen, indem Sie enumerate() verwenden und die Anzahl der Übereinstimmungen zählen, indem Sie sie in einer Liste speichern und deren Länge überprüfen.

Ein weiteres Problem ist, dass die Beispiel-Eingabedateien keine Kopfzeilen enthalten. Unter der Annahme, sie ihnen zu tun enthalten sollte Folgendes tun, was Sie wollen:

import csv 

MAX_COUNT = 300 
filename1 = '/Volumes/cachannel/CUTLER/subsampling/in-silico_IDC18_GFP18_names_only.csv' 
filename2 = '/Volumes/cachannel/CUTLER/subsampling/ICD18_GFP18_names_only.csv' 
matches = [] 

with open(filename1, 'rb') as file1: 
    file1reader = csv.reader(file1) 
    header1 = file1reader.next() 

    for line1 in file1reader: 
     with open(filename2, 'rb') as file2: 
      file2reader = csv.reader(file2) 
      header2 = file2reader.next() 

      for linenum, line2 in enumerate(file2reader, start=1): 
       if line1 == line2: 
        print('match found') 
        matches.append(str(linenum)) 
        if len(matches) >= MAX_COUNT: 
         break 

     if len(matches) >= MAX_COUNT: 
      break 

with open("Rank_results.txt", 'w') as outfile: 
    outfile.write(' '.join(matches) + '\n') 
+0

Danke! Das funktioniert einwandfrei. Ich wusste nicht über enumerate(), das wird in der Zukunft sehr hilfreich sein. Meine einzige Frage ist, wenn Sie überprüfen, ob len (Übereinstimmungen)> = MAX_COUNT, warum haben Sie es an zwei verschiedenen Orten? – Labrat

+0

Gern geschehen. Ich habe einen Längen-Check in jede der For-Schleifen gelegt. Eine zweite wurde benötigt, wenn also die Bedingung während der inneren getroffen wurde, würde sie sich zu der äußeren fortpflanzen, was es beiden erlaubte, früh zu enden, sobald es passierte. Diese Art von Sache kann auch mit Ausnahmen behandelt werden, die mehr "Pythonic" haben könnten ... – martineau

Verwandte Themen