1

我有两个非常大的 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
4

1 回答 1

2

你应该使用dict

您的解决方案中的瓶颈是比较两个文件中的每对记录的名称。

更好的解决方案是存储第一个文件中的所有记录,然后对于第二个文件中的每一行,找出是否在第一个文件中找到了同名的记录,如果是,则将它们连接起来。

dict 存储成对的数据:一个“key”和一个“value”;并允许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')
于 2013-05-02T02:44:12.230 回答