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 服务获取序列数据时使用过这种技术,不想写入临时文件。
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 服务获取序列数据时使用过这种技术,不想写入临时文件。