2016-04-10 16 views
1

Ich habe eine sehr große Textdatei, die wie unten wie folgt aussieht:neue Datei in Python 2.7

datei.txt

rs121334 6546 
    rs42323 4214 
    rs254532 5223 
    .   . 
    .   . 
    rs42323 5223  

, wo die erste Spalte eine rs-Nummer und die zweite Spalte eine Gen-Nummer. Ich möchte einen Code schreiben, der in der Datei file.txt nach bestimmten Gennummern sucht und die Zeilen schreibt, in denen diese spezifischen Gennummern in einer anderen set.txt-Datei gefunden wurden. Ich habe den folgenden Code, aber es funktioniert nicht:

dta=open("file.txt","r") 
w=open("set.txt","w") 
searchgenes=('5223','2645') 
for line in dta.readlines(): 
    line=line.split() 
    for word in searchgenes: 
     if word in line[1]: 
      w.write(line) 

Wenn ich den Code ausführen, bekomme ich typerror:

erwartet ein Zeichenpuffer-Objekt.

Jede Hilfe/Vorschläge werden geschätzt. Vielen Dank!

+0

Wie die Input/Output-Dokumentation besagt, "Um etwas anderes als eine Zeichenfolge zu schreiben, muss es zuerst in eine Zeichenfolge konvertiert werden". Ändern Sie einfach Ihre letzte Zeile in: w.write (str (line)) – n1c9

Antwort

0

Der folgende Code sollte funktionieren:

dta=open("file.txt","r") 
w=open("set.txt","w") 
searchgenes=('5223','2645') 
for line in dta.readlines(): 
    rs_number, gene_number=line.split() 
    print(gene_number) 
    for word in searchgenes: 
     if word in gene_number: 
      w.write(line) 
dta.close() 
w.close() 

Es ist besser für die Weiterverwendung der Zeilenvariablen und die Ein- und Ausgabedateien geschlossen werden sollen, zu vermeiden.

+1

Angenommen, in file.txt gibt es ein Gen 127 und 127065, also sagen wir im Code über searchgenes = ('5223', '127'). Wenn ich den obigen Code ausführe, gibt die Ausgabe auch Ergebnisse für das Gen 127065 aus, einfach weil "127" innerhalb des Gens "127065" erscheint. Ich möchte nur, dass die Ausgabe die Gene 127 und 5223 enthält. Ich habe versucht, den Code durch Setzen von searchgenes = ('5223', "\ b127 \ b") zu korrigieren, aber es scheint nichts zu tun. Irgendwelche Vorschläge? –

+0

Sie haben Recht, ich habe irgendwie angenommen, dass dies das beabsichtigte Verhalten ist. Wenn man einen String-Vergleich mit "==" (statt der "In" -Syntax) auf Identität prüfen möchte, würde das Problem gelöst. –

+0

Danke! Es funktionierte! –

-1

Sie verwenden die Variable line, um auf zwei verschiedene Dinge zu verweisen: die Textzeile und die Liste, die sich aus der Teilung der Zeile ergibt - dies führt zu Verwirrung. Um die ursprünglichen Zeilen zu schreiben, verwenden Sie eine andere Variable für die Liste.

for line in dta: 
    words=line.split() 
    for word in searchgenes: 
     if word in words[1]: 
      w.write(line) 
+0

Vielen Dank! Das hat wirklich geholfen! –