2016-07-13 16 views
1
import gzip 
import io 
from Bio import SeqIO 

infile = "myinfile.fastq.gz" 
fileout = open("myoutfile.fastq", "w+") 
with io.TextIOWrapper(gzip.open(infile, "r")) as f: 
    line = f.read() 
fileout.write(line) 
fileout.seek(0) 

count = 0 
for rec in SeqIO.parse(fileout, "fastq"): #parsing from file 
    count += 1 
print("%i reads" % count) 

Das obige funktioniert, wenn "Zeile" in eine Datei geschrieben wird und diese Datei Feed an den Parser, aber unten funktioniert nicht. Warum kann Zeile nicht direkt gelesen werden? Gibt es eine Möglichkeit, "Zeile" direkt zum Parser zu führen, ohne zuerst in eine Datei schreiben zu müssen?Biopython Parsen von Variable anstelle von Datei

infile = "myinfile.fastq.gz" 
#fileout = "myoutfile.fastq" 
with io.TextIOWrapper(gzip.open(infile, "r")) as f: 
    line = f.read() 
#myout.write(line) 

count = 0 
for rec in SeqIO.parse(line, "fastq"): #line used instead of writing from file 
    count += 1 
print("%i reads" % count) 

Antwort

4

Es ist, weil SeqIO.parse nur eine Datei-Handler oder einen Dateinamen als ersten Parameter akzeptiert.

Wenn Sie direkt in SeqIO.parse nur einen Handler es passieren eine gzip-Datei lesen möchten:

import gzip 
from Bio import SeqIO 

count = 0 
with gzip.open("myinfile.fastq.gz") as f: 
    for rec in SeqIO.parse(f, "fastq"): 
     count += 1 

print("{} reads".format(count)) 
+1

Das hat funktioniert. Nur benötigt, um den io.TextIOWrapper hinzuzufügen, der die "mit" -Zeile macht ... mit io.TextIOWrapper (gzip.open (infile, "rb")) als f: – Stuber

1

einfach auf die andere Antwort hinzuzufügen, wenn Ihre Eingangssequenz von etwas gelesen wird anders als eine Datei (dh eine Web-Abfrage), dann können Sie io.StringIO verwenden, um ein dateiähnliches Objekt zu simulieren. Ein StringIO-Objekt verhält sich wie ein Datei-Handle, liest/schreibt jedoch aus einem Speicherpuffer. Die Eingabe in StringIO() sollte eine Zeichenfolge sein, keine andere Datei oder Dateihandle.

from io import StringIO 

infile = "myinfile.fastq.gz" 
with io.TextIOWrapper(gzip.open(infile, "r")) as f: 
    line = f.read() 

fastq_io = StringIO(line) 
records = SeqIO.parse(fastq_io, "fastq") 
fastq_io.close() 
#Do something to sequence records here 

Es ist erwähnenswert, dass ein StringIO Objekt geschlossen werden muss, den Speicherplatz freizugeben, wenn Sie also eine Menge von ihnen verwenden, dann werden Sie auf Probleme stoßen, wenn Sie nicht .close() tun sie. Vor diesem Hintergrund ist es wahrscheinlich am beste Praxis, sie innerhalb eines with ... as ...: Block zu verwenden:

with StringIO(line) as fastq_io: 
    records = SeqIO.parse(fastq_io, "fastq") 

#Do something to sequence records here 

ich diese Technik ein gutes Stück verwendet habe, wenn Sequenzdaten von Web-Service bekommen, und will nicht schreiben eine temporäre Datei.