Comment lire un fichier FASTA en Python ?
Un fichier FASTA est un fichier texte qui range une ou plusieurs séquences, chacune précédée d’une ligne de nom. C’est le format le plus simple pour échanger des séquences.
Savoir le lire, c’est pouvoir charger n’importe quelle série de séquences dans un programme. Vous allez découper le texte ligne par ligne et recoller les séquences coupées.
À la fin de cette leçon
Remarque
Je peux lire un fichier FASTA et en tirer le nom et la séquence de chaque enregistrement.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| FASTA | un format de fichier texte pour des séquences | |
| En-tête | la ligne de nom, qui commence par le signe > | >s1 premiere |
| Enregistrement | un en-tête et les lignes de bases qui le suivent | |
| Ligne repliée | une séquence coupée en plusieurs lignes courtes | |
| Dictionnaire | une table qui associe un nom à une valeur |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un enregistrement FASTA a un en-tête
Chaque enregistrement commence par une ligne qui débute par >. C’est l’en-tête : son premier mot est le nom de la séquence. Le reste est un commentaire libre.
Les lignes suivantes contiennent les bases. Un nouveau > ouvre l’enregistrement suivant.
Exemple travaillé : un fichier de deux enregistrements
| Ligne du fichier | Ce que c’est | Ce qu’on en tire |
|---|---|---|
| >s1 premiere | en-tête | nom s1 |
| ATGGCG | bases | début de s1 |
| CTAAGC | bases | suite de s1 : 12 bases en tout |
| >s2 seconde | en-tête | nom s2 |
| TTGACC | bases | s2 : 6 bases |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une séquence repliée se recolle ligne après ligne
Les fichiers coupent souvent les longues séquences en lignes courtes, par exemple de 60 bases. Une ligne n’est donc pas toujours une séquence entière.
Pour lire un fichier, on parcourt les lignes. Une ligne qui commence par > ouvre un enregistrement. Toute autre ligne non vide est collée à la séquence en cours.
Lire un texte FASTA avec une boucle
texte = ">s1 premiere\nATGGCG\nCTAAGC\n>s2 seconde\nTTGACC\n"
sequences = {}
nom = ""
for ligne in texte.split("\n"):
if ligne.startswith(">"):
# L'en-tête : le nom est son premier mot, sans le signe >.
nom = ligne[1:].split()[0]
sequences[nom] = ""
elif ligne != "":
# Une ligne de bases : on la colle à la séquence en cours.
sequences[nom] = sequences[nom] + ligne
print(sequences["s1"])
print(len(sequences["s1"]), len(sequences["s2"]))
# Ajoutez un troisième enregistrement dans le texte puis relancez.
Une erreur fréquente
Attention
Beaucoup croient qu’une ligne du fichier est une séquence. Si la séquence est repliée, chaque ligne n’en est qu’un morceau. Collez les lignes jusqu’au prochain en-tête avant de compter quoi que ce soit.
Dans le labo, un petit fichier FASTA
La commande suivante écrit dans le dossier de travail du labo un petit fichier exemple.fa, avec les deux enregistrements du tableau. Elle n’affiche rien.
Vous pouvez ensuite compter les en-têtes avec grep, puis lire chaque enregistrement avec Python. Les séquences sont inventées.
Écrire le fichier exemple.fa
docker exec jupyter sh -c "printf '>s1 premiere\nATGGCG\nCTAAGC\n>s2 seconde\nTTGACC\n' > exemple.fa"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Compter les en-têtes du fichier
docker exec jupyter grep -c '>' exemple.faAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lire les noms et les longueurs
docker exec jupyter python3 -c "print([(b.split('\n')[0].split()[0], len(''.join(b.split('\n')[1:]))) for b in open('exemple.fa').read().split('>')[1:]])"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Pour aller plus loin
Dans votre carnet, écrivez à la main un fichier FASTA de trois enregistrements dont une séquence repliée sur trois lignes. Lisez-le avec votre boucle.
Écrivez ensuite une ligne de code qui affiche le nom de chaque enregistrement et son taux de GC.