0
votes

Comment puis-je modifier mon script Python afin qu'il puisse sélectionner tout le texte d'une séquence FASTA?

J'ai 2 fichiers: one est un fichier texte contenant une série d'identifiants et l'autre est un fichier Multifasta contenant des séquences FASTA correspondant aux identifiants dans le premier fichier. J'ai un script Python pouvant sélectionner les identifiants correspondants des deux fichiers. Il ressemble à ceci: xxx

J'ai besoin d'éditer mon script afin qu'il puisse sélectionner le texte de la séquence à côté de son identifiant correspondant. Pouvez-vous m'aider s'il vous plaît faire cela? Merci.


7 commentaires

Voulez-vous dire pour CLE, valeur de SEQ_DICT.ITEMS (): Imprimer (CLE, VALEUR) ?


Pouvez-vous donner un exemple de votre sortie désirée?


Veuillez ajouter des échantillons de vos fichiers d'entrée. Veuillez ne pas supposer que les gens sauront ce que FASTA / MULTIFASTA est (est-ce même pertinent pour la question?).


@Bazingaa Oui c'est tout et à côté de l'identifiant correspondant, j'ai besoin d'extraire le texte de la séquence également.


@YuvalG ma sortie désirée devrait être comme ceci:> tr | A0A1D3TK72 | A0A1D3TK72_PLAFA MSNLIEKIKKHMEIGSKVCNTTPEINTSMASPNLKEIKVDIDMEMEEGIIDEDIMTPRVF DRTKKGMGVKNFVMNKSENK EKRKEINAKNDEYSSAYDSS SNRSMTKRARKGNAKESRDY VESHKDSEAENIENAETVEN IGSVDNDEYVQSGENGDSGE NDQNDQNGQRGFSPGNDDSV STNERMDPPEECGGIEGIGN SNHGDECGDEFGDKCGDECG DEFGDKCGDECGDEYGNEHG NEHGNEYSMEKEDACPFVNI TWQTPKKSNVGLYYSGIDNP STLKKYKTPCEMDMLHPDES


@petre désolé pour la confusion. Mes fichiers d'entrée sont: le premier est un fichier IDS:> TR | Q8IM60 | Q8IM60_PLAF7> TR | C6KSM0 | C6KSM0_PLAF7> TR | Q8am1 | Q8am1_plaf7. Le second fichiers de sortie contient de nombreuses séquences FASTA comme ceci:> tr | A0A1D3TK72 | A0A1D3TK72_PLAFA MSNLIEKIKKHMEIGSKVCNTTPEINTSMASPNLKEIKVDIDMEMEEGIIDEDIMTPRVF DRTKKGMGVKNFVMNKSENK EKRKEINAKNDEYSSAYDSS SNRSMTKRARKGNAKESRDY VESHKDSEAENIENAETVEN IGSVDNDEYVQSGENGDSGE NDQNDQNGQRGFSPGNDDSV STNERMDPPEECGGIEGIGN SNHGDECGDEFGDKCGDECG DEFGDKCGDECGDEYGNEHG NEHGNEYSMEKEDACP


Je pense que ce dont vous avez besoin est lire () au lieu de parse () . EDIT: gratter qui, lisez () est pour des fichiers avec exactement un enregistrement.


3 Réponses :


0
votes

Si vous souhaitez extraire uniquement les éléments du fichier code> nom code>, il est probablement plus efficace pour lire les noms en mémoire d'abord.

from Bio import SeqIO

wanted = dict()
with open("names","r") as lines:
    for line in lines:
        wanted[line.strip()] = 1

for record in SeqIO.parse("fasta1.fasta","fasta"):
    if record.id in wanted:
        print(record.seq)


2 commentaires

Je ne sais vraiment pas si c'est ce que vous demandez réellement.


Merci pour votre aide mais malheureusement, cela n'a pas marché pour moi.



0
votes

Voir si cela fonctionne:

from Bio import SeqIO

fasta=SeqIO.parse("fasta1.fasta","fasta")
seq_dict = {}

for record in fasta:
    seq_dict[record.id.strip()] = record.seq

with open("names","r") as lines:
    for line in lines:
        l = line.strip().lstrip('<')
        if l in seq_dict:
            print(l) # ID
            print(seq_dict[l])  # sequence


10 commentaires

J'ai essayé votre script mais je n'ai reçu aucune sortie. Des idées pourquoi est-ce? Merci encore.


@Yugalg en exécutant ce script édité, malheureusement, je n'ai reçu aucune sortie.


Alors peut-être que je suis mal compris ce que vous essayez d'accomplir. Ce que j'ai compris, c'est ceci: vous avez un fichier de noms qui contient des identifiants et un autre fichier de FASTA Records. Vous souhaitez imprimer l'identifiant et la séquence pour chaque enregistrement dans le fichier FASTA si l'ID est également dans le fichier noms. Est-ce correct?


Oui, mais le deuxième fichier contient des séquences correspondant aux ID des noms des fichiers non enregistrés. Je souhaite un script qui lit les identifiants dans les fichiers de noms que de rechercher des séquences ayant des identifiants correspondants pour les identifiants dans le premier fichier. Ensuite, la sortie doit être l'ID correspondant avec ses séquences.


Oui. C'est ce que ce script devrait faire. J'ai fait un autre petit édition au code. Combien d'identifiants sont dans votre nom de nom? Êtes-vous sûr qu'il existe des identifiants correspondants entre le fichier FASTA et le fichier noms? Il semble que votre fichier de noms n'a que trois identifiants. Peut-être qu'il n'y a pas de correspondance dans le fichier FASTA pour ceux-ci?


Il y a plus de 500 identifiants dans le fichier d'origine et oui, il existe des identifiants correspondants entre les 2 fichiers.


Votre sortie à la réponse de Petre était ('Noms:', ['TR | Q8IM60 | Q8IM60_PLAF7', 'TR | C6KSM0 | C6KSM0_PLAF7', 'TR | Q8iam1 | Q8am1_plaf7']), alors seulement trois identifiants sont imprimés à partir de votre fichier nom . Peut-être que vous ne le chargez pas correctement, ou il peut y avoir une autre erreur. Malheureusement, sans votre code complet et vos fichiers, il sera très difficile de vous aider à déterminer où le problème est.


@Yuvalg Je viens de remarquer que votre solution ait la même approche et les mêmes hypothèses, alors le mien est redondant. Désolé pour ça.


Pas de mal. Si vous parvenez à comprendre pourquoi le code OPS se comporte de la manière dont il est, je suis à perte


@Yuvalg aucun inquiétude! Merci pour toute l'aide que vous me donniez. J'ai vraiment apprécié cela :)



0
votes

Après avoir joué un peu avec Bio.Seqio, j'ai conclu que @bazingaa est probablement correct. Adapté votre code comme si: XXX

Vous semblez être nouveau à Python, voici ce que j'ai fait:

  • au lieu de garder enregistrement.seq, j'ai stocké record.description
  • pour a, b dans .items () ira déterrera via la touche de retour des éléments du dictionnaire, valeur de valeur dans les variables A, B de B. / LI>

    J'espère que cela aide.

    Edit:

    Voici une version quelque peu plus "pythonique". Je ne comprends pas vraiment ce que Fasta est alors j'ai supposé que vous voudriez lire des lignes de noms, prenez «TR | quelque chose | Quelque chose» comme IDS (sans leader '>') et imprimez ceux de 'FASTA1 .fasta 's'ils sont en noms: xxx


3 commentaires

J'ai essayé le premier script et j'ai seulement les identifiants du premier fichier suivant les identifiants des séquences FASTA sans les textes des séquences. Pour le deuxième script, j'ai cela comme une sortie: ('Noms:', ['TR | Q8IM60 | Q8IM60_PLAF7', 'TR | C6KSM0 | C6KSM0_PLAF7', 'TR | Q8IAM1 | Q8am1_PLAF7']) ('record:' , 'TR | Q8IEB1 | Q8IEB1_PLAF7') ('Record:', 'TR | C6KSV2 | C6KSV2_PLAF7') ('Record:', 'TR | Q8IIJ2 | Q8IIJ2_PLAF7')


@YASMINEOCHI: Eh bien oui, j'ai ajouté des impressions pour montrer ce qu'il fait entre les deux. Si c'est toute la sortie, qu'aucun des enregistrements de FASTA1 ne correspond aux identifiants dans les noms. Encore une fois, je n'ai aucune idée de ce que FASTA est si mes hypothèses pourraient être fausses, désolées pour cela. Depuis les exemples que vous avez donnés, il ne semble pas y avoir de match entre les deux, donc je viens de supposer que record.id devrait être une ligne de noms. Si vous avez besoin de quelque chose d'autre, veuillez la clarifier dans votre question.


Ok merci beaucoup pour votre aide. Je pense que je vérifierai à nouveau mon fichier FASTA1. :)