2017-04-19 2 views
1

J'essaie d'écrire en Python un code pour parcourir chaque séquence dans mon fichier fasta et imprimer une nouvelle liste de chaque séquence en utilisant une fenêtre glissante de 1000 nucléotides, mais je ne suis pas sûre est faux.Itérer sur une séquence dans une fenêtre de 1000 nucléotides

"Traceback (most recent call last): 
File "<stdin>", line 4, in <module> 
TypeError: expected a string or other character buffer object" 

Voici mon code:

from Bio import SeqIO 
for record in SeqIO.parse("fasta.txt", "fasta"): 
    pos=0 
    if pos<len(record)+1: 
     dna_1000.write("\n"+">"+record.id+"_"+pos+"\n"+record[pos:pos+1000]) 
     pos=pos+1000 

Je l'ai essayé un peu différemment:

from Bio import SeqIO 
for record in SeqIO.parse("fasta.txt", "fasta"):  
    for pos in range(0,len(record)+1,1000): 
     dna_1000.write("\n"+">"+record.id+"_"+"\n"+record[pos:pos+1000]) 

mais je reçois aussi ce message:

Traceback (most recent call last): 
    File "<stdin>", line 3, in <module> 
TypeError: expected a string or other character buffer object 

Merci d'avoir pris un coup d'oeil à ça!

Répondre

0

Votre code d'origine échoue avec TypeError: cannot concatenate 'str' and 'int' objects en raison de la ligne dna_1000.write(...+'_'+pos+...) où vous ajoutez l'objet '_'type('_') = str à l'objet postype(pos) = int. Ceci est impossible car Python n'ajoute jamais implicitement de chaînes et d'ints: vous devez transformer l'int en une chaîne avant de l'ajouter: dna_1000.write(...+'_'+str(pos)+...).

Maintenant nous rencontrons votre autre erreur TypeError: expected a string or other character buffer object. Cela provient de la méthode dna_1000.write qui se plaint de ne pas savoir quoi faire de son argument. Il s'attend à quelque chose comme une chaîne mais obtient "\n"+">"+record.id+"_"+str(pos)+"\n"+record[pos:pos+1000]) qui est un SeqRecord. C'est parce que record est un SeqRecord, découper un SeqRecord vous donne un SeqRecord, et ajouter une chaîne à un SeqRecord vous donne un SeqRecord (avec une séquence de nucléotides modifiée). Pour accéder réellement à la séquence nucléotidique sous-jacente de tranchée, vous devez utiliser .seq, et pour l'écrire dans un fichier, vous devez le convertir en une chaîne. Donc, pour faire fonctionner votre code sans erreurs que vous pourriez faire quelque chose comme:

from Bio import SeqIO 
for record in SeqIO.parse("fasta.txt", "fasta"): 
    pos=0 
    if pos<len(record)+1: 
     seqstr = str(record[pos:pos+1000].seq) 
     dna_1000.write("\n"+">"+record.id+"_"+str(pos)+"\n"+seqstr) 
     pos=pos+1000 

Que ce soit la meilleure façon de résoudre votre problème (ou si ce code ne même pas ce que vous attendez) est une autre question que je ne avoir l'arrière-plan pour répondre. Ma seule autre suggestion est de lire http://biopython.org/wiki/SeqIO pour voir si l'une des fonctions IO inclus aiderait.

+1

Merci à Trevor pour l'explication. Je comprends que Python ne peut pas combiner des chaînes et des entiers mais j'ai du mal à appliquer cette règle quand j'écris le code. Votre suggestion nous a été utile. J'ai juste besoin de changer la boucle "if" en une boucle "while" car autrement, elle n'affichait que la "première" fenêtre glissante pour tous les enregistrements car l'instruction if était vraie (pos était défini à l'extérieur). Cela fonctionne maintenant magnifiquement. Merci beaucoup encore! –