2016-07-13 4 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) 

"line"이 파일에 기록되고 해당 파일이 구문 분석기로 공급되지만 아래의 경우 작동하지 않습니다. 왜 라인을 직접 읽을 수 없습니까? 파일에 먼저 쓰지 않고도 파서에 "라인"을 직접 공급할 수있는 방법이 있습니까?파일 대신 변수에서 Biopython을 구문 분석합니다.

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) 

답변

4

SeqIO.parse는 파일 핸들러, 또는 첫 번째 매개 변수로 파일 이름을 받아 때문입니다.

직접 SeqIO.parse로 gzip으로 압축 된 파일을 읽고 싶다면 단지에 핸들러를 통과 : 사용자의 입력 순서가 파일이 아닌 다른 읽을되는 경우

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

이것은 효과가 있습니다. io.TextIOWrapper ("giip.open (infile,"rb "))를 f로 사용하여 io.TextIOWrapper를"with " – Stuber

1

그냥 다른 대답에 추가 할을 (예 : 웹 질의), io.StringIO을 사용하여 파일과 같은 객체를 시뮬레이션 할 수 있습니다. StringIO 객체는 파일 핸들처럼 동작하지만 메모리 버퍼에서 읽고 씁니다. StringIO()의 입력은 다른 파일이나 파일 핸들이 아닌 문자열이어야합니다.

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 

그것은 StringIO 객체가 메모리 공간을 확보하기 위해 폐쇄 될 필요가 있음을 주목할 필요가있다, 그래서 당신이 그 (것)를 많이 사용하는 경우 당신이하지 .close()을 할 경우 다음 문제로 실행됩니다. 나는 웹 서비스에서 시퀀스 데이터를 가져올 때이 기술을 공정한 비트를 사용했습니다, 그리고 쓰기를 원하지 않는

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

#Do something to sequence records here 

: 염두에두고, 그것은 with ... as ...: 블록 내에서 사용할 수있는 가장 좋은 방법은 아마도 임시 파일.