0

我正在处理一个大的 BLAST 文件和一个大的 FASTA 文件,我需要为一个 BLAST 块加载几行 FASTA(假设它是一行)。

我希望在 BLAST 的第二个循环(行)中,它将在最后处理的 FASTA 行的下一行继续,但它正在加载所有相同的 FASTA 行。为什么?我怎样才能加载下一行?真的有必要添加一些索引吗?

with open(fastaname,'r') as fastafile:
  with open(blastfilename,'r') as blastfile:
    for line in blastfile:
      while True:  
        fastaline = fastafile.readline()[:-1]  
            if fastaline[0]=='>':  
                break  
            fastaseq += fastaline
      somefunction(line,fastaseq)

FASTA 具有典型的格式:

>name_of_seqence\n  
ACGATCATCGTAGCTGCATGACTGCA\n  
GATCGATCTGATCGATGCAGTCAGTA\n
>name_of_seqence\n  
GCACGCGACCACGATCATTGACTGCA\n  
CAAAAGATCTGATCGATGCAGTCAGT\n
CAGTCGATGCTAGTCGATGCTCGATA\n
etc.

我需要下一个 BLAST 序列的每一行的每个序列。

4

2 回答 2

5

fastaseq在完成您的爆炸文件中的一行后,我看不到任何可以清除您附加到的行的东西。试试这个:

with open(fastaname,'r') as fastafile:
    with open(blastfilename,'r') as blastfile:
        for line in blastfile:
            fastaseq = '' # or whatever data type this is 
            while True:  
                fastaline = fastafile.readline()[:-1]  
                if fastaline[0]=='>':  
                    break  
            fastaseq += fastaline
        somefunction(line,fastaseq)

因为这是您的第一条爆炸线将获得第一组 fasta 线,第二条爆炸线将获得第一组和第二组,依此类推。

于 2013-11-06T22:03:05.747 回答
1

自己解析 FASTA 文件的另一种方法是使用预先存在的解析器,例如 Biopython 的SeqIO.

您还可以使用zip()并排迭代两个可迭代对象。

使用Biopython,您的代码将如下所示:

from Bio import SeqIO

with open(fastaname, 'r') as fastafile, open(blastname, 'r') as blastfile:
    for record, line in zip(SeqIO.parse(fastafile, 'fasta'), blastfile):
        somefunction(line, record.seq)
于 2013-11-06T22:40:06.307 回答