Biopython 从变量而不是文件解析

Biopython parse from variable instead of file

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)

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

如果您想将压缩文件直接读入 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))

只是为了补充另一个答案,如果您的输入序列是从文件以外的其他内容(即网络查询)读取的,那么您可以使用 io.StringIO 来模拟类似文件的对象。 StringIO 对象的行为类似于文件句柄,但 reads/writes 来自内存缓冲区。 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 对象以释放内存 space,因此如果您使用了很多对象,那么您将 运行如果您不 .close() 解决问题。考虑到这一点,最好的做法可能是在 with ... as ...: 块中使用它们:

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

#Do something to sequence records here

我在从 Web 服务获取序列数据时使用过这种技术,不想写入临时文件。