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