Biopython从变量而不是文件解析

时间:2016-07-13 17:28:52

标签: python biopython

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”写入文件并且该文件被提供给解析器时,上述方法有效,但是下面的方法不起作用。为什么不能直接读取行?有没有办法直接将“line”提供给解析器,而不必先写入文件?

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)

2 个答案:

答案 0 :(得分:5)

这是因为SeqIO.parse只接受文件处理程序或文件名作为第一个参数。

如果您想直接将gzip压缩文件读入SeqIO.parse,只需将处理程序传递给它:

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 :(得分:1)

只是为了添加其他答案,如果您的输入序列是从文件以外的其他内容(即Web查询)中读取的,那么您可以使用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对象需要关闭才能释放内存空间,所以如果您使用了大量内存空间,那么如果您不使用,则会遇到问题。 t .close()他们。考虑到这一点,最好在with ... as ...:块中使用它们:

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

#Do something to sequence records here

从网络服务获取序列数据并且不想写入临时文件时,我已经使用了这种技术。