我有两个非常大的fasta文件,两者都在2GB左右。他们有一些序列共享相同的名称,所以它就像:
在R1.fasta中:
“> ABC001 ACTGTGTCGTG
“> ABC003 ACTGTGTCGTG
“> ABC005 ACTGTGTCGTG
“> ABC010 ACTGTGTCGTG
和R2.fasta
“> ABC002 ACTGTGTCGTG
“> ABC003 ACTGTGTCGTG
“> ABC005 ACTGTGTCGTG
“> ABC009 ACTGTGTCGTG
我想找到两个文件之间的共享序列,可以写入一个新的fasta文件并用间隙连接两个序列,所以新文件看起来像:
“> ABC003 ACTGTGTCGTG ----- ACTGTGTCGTG
“> ABC005 ACTGTGTCGTG ----- ACTGTGTCGTG
我已经编写了一个python脚本来完成这项工作,但它运行得非常慢。我想知道是否有更快的方法来做到这一点。谢谢!代码就像:
from Bio import SeqIO
from Bio.Seq import Seq
R1 = 'L008_R1.forward.trim.fasta' #input R1 file
R2 = 'L008_R2.reverse.trim.fasta' # input R2 file
R = 'Gap20.L008.R1.fasta' #output joined fasta
n1 = 0
n2 = 0
for rec1 in SeqIO.parse(R1, 'fasta'): #exam every record in R1 file one by one
n1 = int(rec1.id[5:])
r = rec1
for rec2 in SeqIO.parse(R2,'fasta'):
n2 = int(rec2.id[5:])
if n1 == n2:
seq = rec1.seq+'--------------------'+rec2.seq
r.seq = seq
output = open(R, 'aw') # write to a new fasta file
SeqIO.write(r, output, 'fasta')
break
elif n1 < n2:
else: pass
答案 0 :(得分:2)
您应该使用dict。
解决方案的瓶颈是比较两个文件中的每对记录的名称。
更好的解决方案是存储第一个文件中的所有记录,然后对第二个文件中的每一行查找是否在第一个文件中找到了相同名称的记录,如果是这种情况则连接它们。
dict存储数据对:“键”和“值”;并允许通过密钥快速(O(n log n)
)插入此类对和快速查找。在您的情况下,记录名称将作为键,序列作为值。
大致(未经测试)看起来像:
# Assuming that record id's are unique within a single file
records = dict()
output = open(R, 'aw')
for record in SeqIO.parse(R1, 'fasta'):
record_id = int(rec.id[5:])
records[record_id] = rec1.seq
for record in SeqIO.parse(R2, 'fasta'):
record_id = int(rec2.id[5:])
if record_id in records:
r = records[record_id]
r.seq = r.seq + '--------------------' + record.seq
else:
r = record
SeqIO.write(r, output, 'fasta')