我是python编程领域的新手。当我试图做一些分析时,(我试图在其他帖子上找到答案,但没什么)我决定发布我的第一个也许是非常愚蠢的问题。为什么这只创建一个输出文件,尽管在这个例子中应该至少有8个(序列超过8000个字符)。 谢谢你的回答。
def batch_iterator(iterator, batch_size) :
entry = True
while entry :
batch = []
while len(batch) < batch_size :
try :
entry = iterator.next()
except StopIteration :
entry = None
if entry is None :
#End of file
break
batch.append(entry)
if batch :
yield batch
from Bio import SeqIO
record_iter = SeqIO.parse(open("some.fasta"),"fasta")
for i, batch in enumerate(batch_iterator(record_iter, 1000)) : #I think sth is wrong here?
filename = "group_%i.fasta" % (i+1)
handle = open(filename, "w")
count = SeqIO.write(batch, handle, "fasta")
handle.close()
print "Wrote %i records to %s" % (count, filename)
答案 0 :(得分:0)
经过与OP的长时间讨论后,这是我的重组方案,使用this other SO thread中定义的生成器函数
# file: main.py
from Bio import SeqIO
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
def chunks(l, n):
"""Yield successive n-sized chunks from l."""
for i in xrange(0, len(l), n):
yield l[i:i+n]
if __name__ == '__main__':
handle = open('long.fasta', 'r')
records = list(SeqIO.parse(handle, "fasta"))
record = records[0]
for pos, chunk in enumerate(chunks(record.seq.tostring(), 1000)):
chunk_record = SeqRecord(Seq(
chunk, record.seq.alphabet),
id=record.id, name=record.name,
description=record.description)
outfile = "group_%d.fasta" % pos
SeqIO.write(chunk_record, open(outfile, 'w'), "fasta")
请注意,您的原始代码执行的操作非常不同:它从SeqIO.parse
函数提供的生成器中获取新记录,并尝试将它们存储在不同的文件中。如果要在较小的子序列中拆分单个记录,则必须访问记录的内部数据,该数据由record.seq.tostring()
完成。 chunks
生成器函数,如上面链接的另一个线程中所述,返回尽可能多的块,这些块可以从传入的序列构建。它们中的每一个都作为新的fasta记录存储在不同的文件中(如果您只想保留序列,请将chunk
直接写入打开的outfile
)。
请考虑以下代码:
# file: generate.py
from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
from Bio.Alphabet import IUPAC
from Bio import SeqIO
long_string = "A" * 8000
outfile = open('long.fasta', 'w')
record = SeqRecord(Seq(
long_string,
IUPAC.protein),
id="YP_025292.1", name="HokC",
description="toxic membrane protein, small")
SeqIO.write(record, outfile, "fasta")
它将单个记录写入名为“long.fasta”的文件中。此单条记录的内部序列长度为8000个字符,在long_string
中生成。
如何使用它:
$ python generate.py
$ wc -c long.fasta
8177 long.fasta
超过8000个字符的开销是文件头。
如何使用上面的代码片段将该文件分成1000个长度的块:
$ python main.py
$ ls
generate.py group_1.fasta group_3.fasta group_5.fasta group_7.fasta main.py
group_0.fasta group_2.fasta group_4.fasta group_6.fasta long.fasta
$ wc -c group_*
1060 group_0.fasta
1060 group_1.fasta
1060 group_2.fasta
1060 group_3.fasta
1060 group_4.fasta
1060 group_5.fasta
1060 group_6.fasta
1060 group_7.fasta
8480 total