2013-07-31 2 views
0

Aujourd'hui j'ai encore rencontré un problème.rechercher une séquence dans un fichier non délimité par des tabulations

Je dispose d'un fichier qui ressemble à:

fichier A

>chr1 
ACGACTGACTGTCGATCGATCGATGCTCGATGCTCGACGATCGTGCTCGATC 
>chr2 
GTGACGCACACGTGCTAGCGCTGATCGATCGTAGCTCAGTCAG 
>chr3 
CAGTCGTCGATCGTCGATCGTCG 

et ainsi de suite (basiquement un fichier FASTA).

Dans un autre fichier je un onglet bien des informations délimités sur ma lecture:

fichier B

chr2 0 * 2S3M5I2M1D3M * CACTTTTTGTCTA NM:i:6 

Les deux fichiers sont vraiment énormes

Je veux écrire tout ce qui doit être fait, seulement la partie avec laquelle j'ai un problème:

si déposé chr2 à partir du fichier B correspond à la ligne> chr2 dans le fichier A, cherchez CACTTTTTGTCTA (fichierB) dans la séquence du fichier A (seulement en séquence dans la région> chr2. Suivant> chr est un chromosome différent donc je ne veux pas y chercher).

Pour simplifier Cherchons: séquence CACACGTGCTAG dans le fichier A

je tentais en utilisant le dictionnaire pour le fichier A, mais il est complètement impossible.

Des suggestions?

+0

Donc, ce que vous faites maintenant est de créer un dictionnaire à partir du fichier A, dans lequel les touches sont les chromosomes et les valeurs sont des séquences d'ADN? Et puis en utilisant quelque chose comme "fileBField in fileAfield" pour voir si la séquence est dans la valeur de la clé appropriée? – seaotternerd

+0

oui, et c'est très "pas malin". Cependant, j'ai creusé la méthode .next et fait quelques progrès – Irek

Répondre

0

Quelque chose comme:

for req in fileb: 
    (tag, pattern) = parseB(req) 
    tag_matched = False 
    filea = open(file_a_name) 
    for line in filea: 
     if line.startswith('>'): 
      tag_matched = line[1:].startswith(tag) 
     elif tag_matched and (line.find(pattern) > -1) 
      do_whatever() 
    filea.close 

devrait faire le travail si vous pouvez écrire une fonction parseB.

0

Les recherches de dictionnaires sont rapides, il semble donc que la partie qui prend beaucoup de temps doit être recherchée dans la séquence. string.contains() est implémenté en C, donc c'est plutôt efficace. Si ce n'est pas assez rapide, vous devrez probablement utiliser un algorithme plus spécialisé pour l'efficacité, comme discuté ici: Python efficient way to check if very large string contains a substring

Questions connexes