逐行处理文件

时间:2013-11-06 21:54:20

标签: python fasta blast

我正在处理一个大型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序列的每一行。

2 个答案:

答案 0 :(得分:5)

在完成blast文件中的一行之后,我没有看到任何可以清除你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线,第二个爆炸线将获得第一和第二组等等。

答案 1 :(得分: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)