Biopython大序列分裂

时间:2014-04-11 11:39:50

标签: python biopython

我是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)

1 个答案:

答案 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