2016-09-26 13 views
0

dort vergleichen. Ich bin ein begginer in Python, und ich bin zu kämpfen das tun folgendes:Python - Dateien vergleichen Zeichen in Zeile

Ich habe eine Datei wie diese (+ 10k Linie):

EgrG_000095700 /product="ubiquitin carboxyl terminal hydrolase 5" 
EgrG_000095800 /product="DNA polymerase epsilon subunit 3" 
EgrG_000095850 /product="crossover junction endonuclease EME1" 
EgrG_000095900 /product="lysine specific histone demethylase 1A" 
EgrG_000096000 /product="charged multivesicular body protein 6" 
EgrG_000096100 /product="NADH ubiquinone oxidoreductase subunit 10" 

und diese ein (+600 Zeilen):

EgrG_000076200.1 
EgrG_000131300.1 
EgrG_000524000.1 
EgrG_000733100.1 
EgrG_000781600.1 
EgrG_000094950.1 

Alle IDs der zweiten Datei sind in der ersten, so möchte ich die Linien der ersten Datei zu IDs des zweiten entspricht.

Ich schrieb das folgende Skript:

f1 = open('egranulosus_v3_2014_05_27.tsv').readlines() 
f2 = open('eg_es_final_ids').readlines() 
fr = open('res.tsv','w') 

for line in f1: 
    if line[0:14] == f2[0:14]: 
     fr.write('%s'%(line)) 

fr.close() 
print "Done!" 

Meine Idee der ids Abgrenzung der Zeichen pro Zeile Suche war EgrG_XXXX einer Datei zur anderen entsprechen, einem dann schreiben Sie die Zeilen in eine neue Datei . Ich habe einige Modifikationen versucht, das ist nur der "Kern" meiner Idee. Ich habe nichts. In einer der Modifikationen bekam ich nur eine Zeile.

+0

Sind die Zeilen der zweiten Datei immer mit '.1' abgeschlossen? – albert

+0

In der Tat sortieren Sie den Inhalt von 'egranulosus_v3_2014_05_27.tsv' in die Reihenfolge 'eg_es_final_ids'? – roganjosh

+0

Ja, alle Zeilen der zweiten Datei enden mit .1. –

Antwort

0
with open('egranulosus_v3_2014_05_27.txt', 'r') as infile: 
    line_storage = {} 
    for line in infile: 
     data = line.split() 
     key = data[0] 
     value = line.replace('\n', '') 
     line_storage[key] = value 

with open('eg_es_final_ids.txt', 'r') as infile, open('my_output.txt', 'w') as outfile: 
    for line in infile: 
     lookup_key = line.split('.')[0] 
     match = line_storage.get(lookup_key) 
     outfile.write(''.join([str(match), '\n'])) 
+0

zu ersetzen. Sie haben eine Bearbeitung vorgenommen, damit Sie keine 'None' in die Datei schreiben, indem Sie' verwenden if match' – roganjosh

+0

Das hat funktioniert, Mann! Danke vielmals! Das einzige "Problem" ist, dass die Ausgabelinien am Anfang und Ende jeder Zeile mit eckigen Klammern versehen sind, aber das ist leicht zu beseitigen. :) –

+0

@TiagoMinuzzi Am meisten willkommen :) Ändern Sie 'str (match)', um 'nur' zu passen und lassen Sie mich wissen, wenn es weiter besteht. – roganjosh

4

Ich würde die IDs von f2 in einem Set speichern und dann f1 dagegen überprüfen.

id_set = set() 
with open('eg_es_final_ids') as f2: 
    for line in f2: 
     id_set.add(line[:-2]) #get rid of the .1 

with open('egranulosus_v3_2014_05_27.tsv') as f1: 
    with open('res.tsv', 'w') as fr: 
     for line in f1: 
      if line[:14] in id_set: 
       fr.write(line) 
+0

Dies prüft nur auf Existenz in der anderen Datei, es behält nicht die Reihenfolge des Schreibens zu der von 'eg_es_final_ids' – roganjosh

+0

, die nicht funktioniert auch. Das Problem ist meines Erachtens, dass Python zum Beispiel alle Linien "EgrG_000095700/product =" Ubiquitin Carboxyl-terminale Hydrolase 5 "mit dem" EgrG_000095700 "vergleicht, so dass der zweite fehlt das"/Produkt. .. ", Python sind nicht verbindlich. Deshalb möchte ich die Zeichen abgrenzen und dann die Zeile kopieren. –

+0

Versuchen Sie, 'line [: 14]' in der obigen Zeile mit 'line.split() [0] .strip()' –

0

f2 ist eine Liste von Zeilen in Datei-2. Wo wiederholst du die Liste, so wie du es für Zeilen in Datei-1 (f1) machst. Das scheint das Problem zu sein.