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)
答案 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
从网络服务获取序列数据并且不想写入临时文件时,我已经使用了这种技术。