Python 生物ython大序列分裂

Python 生物ython大序列分裂,python,biopython,Python,Biopython,我是python编程领域的新手。当我试着做一些分析时,我试着在其他帖子上找到答案,但没有什么我决定发布我的第一个问题,可能是非常愚蠢的问题。虽然在本例中,应该至少有8个序列超过8000个字符,但为什么只创建一个输出文件呢。 谢谢你的回答 def batch_iterator(iterator, batch_size) : entry = True while entry : batch = [] while len(batch) < batc

我是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)
序列块 在与OP进行了长时间的讨论之后,下面是我重新构造的建议,使用中定义的生成器函数

请注意,您的原始代码做了一些非常不同的事情:它从SeqIO.parse函数提供的生成器中获取新记录,并尝试将它们存储在不同的文件中。如果要将单个记录拆分为更小的子序列,则必须访问记录的内部数据,这是由record.seq.tostring完成的。chunks生成器函数,如上面链接的另一个线程中所述,返回尽可能多的块,以便根据传入的序列进行构建。它们中的每一个都作为新的fasta记录存储在不同的文件中。如果您只想保留序列,请将区块直接写入打开的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个字符长的序列,由长字符串生成

如何使用它:

$ 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

将%i条记录写入%s%count、filename语句的打印输出是什么?你看到它只印过一次吗?是的。整个输出只打印一次:/batch_迭代器函数没有正确缩进,这只是堆栈溢出时的一个坏拷贝,否则它甚至无法开始工作。。。对吗?但有什么不对,如果你认为我能理解,请向我解释一下,否则我猜就通过吧..好吧,整个batch_迭代器函数通常应该缩进4个空格,而不是与声明它的def batch_迭代器行对齐。我已经尝试过了,但它不起作用,我尝试使用迭代的原因是为了有效地使用内存,我相信有一些非常简单的解决方案,但是SeqIO.parse是。事实上,在单独的迭代器函数上或在主循环中增长批处理列表不会影响内存使用,AFAICT。代码应该创建许多具有1000个单位长序列的文件,相反,jsut复制了整个过程。将1条记录写入组_1。fasta是它给我的输出,尽管fasta比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