Python 尝试将fasta分成更小的部分(完全是初学者)

Python 尝试将fasta分成更小的部分(完全是初学者),python,biopython,fasta,Python,Biopython,Fasta,我是一个没有计算机技能的生物学家,但我需要一个简单的脚本将大量的DNA序列分割成更小的。fasta用于BLAST搜索。我已经浏览这个网站好几天了,但都没有找到答案。我几乎是从biopython的食谱中复制了我的代码。为什么这不起作用 def batch_iterator(iterator, batch_size): entry = True # Make sure we loop once while entry: batch = [] whil

我是一个没有计算机技能的生物学家,但我需要一个简单的脚本将大量的DNA序列分割成更小的。fasta用于BLAST搜索。我已经浏览这个网站好几天了,但都没有找到答案。我几乎是从biopython的食谱中复制了我的代码。为什么这不起作用

def batch_iterator(iterator, batch_size):
    entry = True  # Make sure we loop once
    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("/Users/nermin/mainfolder/MTB_NITR203.fasta"),"fasta")
for i, batch in enumerate(batch_iterator(record_iter, 1000)):
    filename = "group_%i.fasta" % (i + 1)
    with open(filename, "w") as handle:
        count = SeqIO.write(batch, handle, "fasta")
    print("Wrote %i records to %s" % (count, filename))
def批迭代器(迭代器,批大小):
entry=True#确保循环一次
进入时:
批次=[]
而透镜(批次)<批次尺寸:
尝试:
entry=迭代器。\下一步__
除停止迭代外:
条目=无
如果输入为无:
#文件结束
打破
批处理追加(条目)
如果是批次:
产量批次
来自Bio import SeqIO
记录=SeqIO.parse(打开(“/Users/nermin/mainfolder/MTB\u NITR203.fasta”),“fasta”)
对于i,枚举中的批(批迭代器(记录iter,1000)):
filename=“group_u%i.fasta”%(i+1)
以open(filename,“w”)作为句柄:
计数=顺序写入(批处理、句柄、“fasta”)
打印(“已将%i条记录写入%s%”(计数,文件名))

错误消息是由代码前面的操作引起的,特别是:

entry = iterator.__next__
应该是:

entry = iterator.__next__()
或者在Python 3中:

entry = next(iterator)
我对您的代码进行的返工:

from Bio import SeqIO

def batch_iterator(iterator, batch_size):
    entry = True  # Make sure we loop once

    while entry:
        batch = []

        while len(batch) < batch_size:
            try:
                entry = next(iterator)
            except StopIteration:
                entry = False

            if not entry:
                # End of file
                break

            batch.append(entry)

        if batch:
            yield batch

record_iter = SeqIO.parse('/Users/nermin/mainfolder/MTB_NITR203.fasta', 'fasta')

for i, batch in enumerate(batch_iterator(record_iter, 1000), start=1):
    filename = 'group_{}.fasta'.format(i)
    count = SeqIO.write(batch, filename, 'fasta')
    print('Wrote {} records to {}'.format(count, filename))
但您的代码处理的实际上是:

>ZB3243.4 Platypus mRNA for dDFD-w, complete cds.
TTTTAATTTTGCTTTCAATATGACGGCTGTCAATGTTGCCCTGATTCGTGATACCAAGTG
GCTGACTTTAGAAGTCTGTAGAGAATTTCAGAGAGGAACTTGCTCTCGAGCTGATGCAGA
TTGCAAGTTTGCCCATCCACCAAGAGTTTGCCATGTGGAAAATGGTCGTGTGGTGGCCTG
>VF42354.1 Rhino Ig active H-chain V-region, subgroup VH-II
TTCATGCAAATATGCTCTCTTTCTTTAGAATATTTCTGTAGGTTTCTTGGGACTGACATT
TAAAACGCCTCACTTTTGAATGTGCACAAAACCTGCTCATTAACATGCATGTGTATAATT
TGTACCTGCAGATCTGATGTTGCATAATACAATCAAATTACTAGATTTTTTAAAGAGAGA
>GS45345.54 Aardvark binding protein.
AACAACACCTGCCACCAGCGTTCCGTTCGCTGCACCAACTACAGGCAATCAGCTGAAATT
CTGAACAGCAGAGTTATGGAGTATCAGAATCTTTCCATGGAAACCTCCATATGGCCTTTC
TATATATATTCTCGTATGTCTTATTCTACCAACACAACAATAAGCGTGTTGCAGTCAATG
... extremely large number of sequences
>GR343245.2 Eggplant subgroup VH-II, mRNA.
TTGCCGCTATGCTCACCCTACTGATGCTTCCATGATTGAAGCGAGTGATAATACTGTGAC
AATCTGCATGGATTACATCAAAGGTCGATGCTCGCGGGAGAAATGCAAGTACTTTCATCC
TCCTGCACACTTGCAAGCCAGACTCAAGGCAGCTCATCATCAGATGAACCATTCAGCTGC
>FG345252.3 Bedbug binding protein 4
TTTTGATTCTCTAAAGGGTCGGTGTACCCGAGAGAACTGCAAGTACCTTCACCCTCCTCC
ACACTTAAAAACGCAGCTGGAGATTAATGGGCGGAACAATCTGATTCAACAGAAGACTGC
CGCAGCCATGTTCGCCCAGCAGATGCAGCTTATGCTCCAAAACGCTCAAATGTCATCACT
>MD2435324.5 Mantis subgroup VH-II, mRNA.
TAAAAATATGCTAATTACAAGTTATAAATCAAACGGAGAGATGGGGGCATGGAGATAGTT
TTTACGTACTGGAGGAAAGTGTGTAAAACCATGGCAATGTCACCTTTTACACAAATGCCA
TTTTCCAAATGCAAATGGCTCATGCTCTTTAGACTACTCTTTGAATAACAAGTAAGATGC
你是在处理大量的序列还是一个大规模的序列

fasta的输入仅仅是一个巨大的序列,大约有400万个 碱基对(与您的第一个示例完全相同),但由于其大小,我们 不能做爆炸式搜索。我们唯一需要的就是把它分成 较小的fasta文件,最好每个文件小于1MB

我们现在已经确定,您的代码并不是为满足您的需要而设计的。因此,让我们通过运行单个序列的数据,将其分解为单独的FASTA文件来解决您的问题:

from Bio import SeqIO
from Bio.SeqRecord import SeqRecord

FILENAME = '/Users/nermin/mainfolder/MTB_NITR203.fasta'

BPS_PER_FILE = 500000  # base pairs per FASTA file

# There should be one and only one record, the entire genome:
large_record = SeqIO.read(FILENAME, 'fasta')

large_sequence = large_record.seq
large_description = large_record.description

limit = len(large_sequence)

for i, start in enumerate(range(0, limit, BPS_PER_FILE), start=1):
    stop = min(start + BPS_PER_FILE, limit)
    small_sequence = large_sequence[start:stop]
    small_description = large_description + "; base pairs {} to {}".format(start, stop)

    small_record = SeqRecord(small_sequence, id=large_record.id, description=small_description)

    filename = 'group_{}.fasta'.format(i)
    count = SeqIO.write(small_record, filename, "fasta")
    assert (count == 1), "Incorrect record count!"
    print('Wrote {} base pairs to {}'.format(stop - start, filename))

每个输出文件都是一个单独的序列,与原始文件类似,但较小,具有修改的描述,现在包括每个特定文件中的碱基对范围。

我认为您需要修复格式。还请让我们知道当您运行这个时会发生什么,您是否得到任何错误,任何结果?我得到关于“方法包装器”对象没有属性的错误id@nermze将完整的堆栈跟踪编辑到您的问题中,以便我们可以看到它。您好,非常感谢您的帮助。输入fasta只是一个大约有400万个碱基对的大序列(与第一个示例完全相同),但由于其大小,我们无法进行blast搜索。我们唯一需要的是将它划分为更小的fasta文件,最好每个文件小于1MB。我使用了错误的设置吗?运行代码后,我得到一个输出:“将1条记录写入组1.fasta”不确定下一步该怎么办。@nermze,这是正确的,
SeqIO.parse()
处理每个文件的多个序列,您只有一个序列,所以它将其作为
group_1.fasta
写出,并完成。我们想要的是
SeqIO.read()
处理文件中的一个序列,并将其序列数据分解为单独的FASTA文件。请看我的补充答案和附加代码。谢谢!这非常有效,现在只剩下最后一个问题了,在我得到信息“给第一组写了50000个碱基对。fasta…等等”之后,我该怎么办?这些文件不是我的电脑,我还需要做什么吗?比如说,我需要写更多的代码来保存它们吗?@nermze,你把我弄丢了——当我运行代码时,文件会在我的计算机上的工作目录中结束(即
pwd
)。你能把
SeqIO.write()
这行删掉吗?似乎不太可能。因为我们没有在代码中更改目录,也没有在输出文件名中添加路径,所以文件应该位于您的工作目录中。你有工作目录的写权限吗?我使用的是Python 3.6.0和BioPython版本1.69
from Bio import SeqIO
from Bio.SeqRecord import SeqRecord

FILENAME = '/Users/nermin/mainfolder/MTB_NITR203.fasta'

BPS_PER_FILE = 500000  # base pairs per FASTA file

# There should be one and only one record, the entire genome:
large_record = SeqIO.read(FILENAME, 'fasta')

large_sequence = large_record.seq
large_description = large_record.description

limit = len(large_sequence)

for i, start in enumerate(range(0, limit, BPS_PER_FILE), start=1):
    stop = min(start + BPS_PER_FILE, limit)
    small_sequence = large_sequence[start:stop]
    small_description = large_description + "; base pairs {} to {}".format(start, stop)

    small_record = SeqRecord(small_sequence, id=large_record.id, description=small_description)

    filename = 'group_{}.fasta'.format(i)
    count = SeqIO.write(small_record, filename, "fasta")
    assert (count == 1), "Incorrect record count!"
    print('Wrote {} base pairs to {}'.format(stop - start, filename))