Question

Je traite un grand fichier de souffle avec un grand fichier fasta, et j'ai besoin de charger plusieurs lignes de Fasta pour un bloc d'explosion (disons que c'est une ligne).

Je m'attendrais à ce que dans la deuxième boucle (ligne) de l'explosion, il se poursuivra sur la ligne suivante de la dernière ligne Fasta traitée, mais elle charge toutes les mêmes lignes FastA. Pourquoi? Et comment puis-je charger la ligne suivante? Est-il vraiment nécessaire d'ajouter une indexation?

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 a le format typique:

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

J'ai besoin de chaque séquence pour chaque ligne de la prochaine séquence de souffle.

Était-ce utile?

La solution

Je ne vois rien qui effacerait jamais les lignes auxquelles vous êtes annexé fastaseq Après avoir terminé une ligne à partir de votre fichier de souffle. Essaye ça:

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)

Comme c'est votre première ligne de souffle obtiendrait le premier ensemble de lignes FastA, la deuxième ligne de souffle obtiendrait les premier et deuxième ensembles, etc.

Autres conseils

Une alternative à l'analyse du fichier fasta vous-même est d'utiliser un analyseur préexistant, comme Biopython SeqIO.

Vous pouvez également utiliser zip() pour itérer plus de deux itérables côte à côte.

Utilisant Biopython, votre code ressemblerait à ceci:

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top