Session de formation 2023
www.southgreen.fr
Mutualisation
bioinformatics platform dedicated to the genetics and genomics of tropical and Mediterranean plants and their pathogens
Rice
Coffee
Cassava
Palm
Banana
Cacao
Magnaporthe
Pseudocercospora
4 institutes
3 research units
25+
Storage and computing resources
Trainings
400+
Tools
Storage and computing resources
Meso@LR au CINES
1090 threads :
35 standard nodes
2 bigmem nodes
1 GPU node
500 To of replicated storage
CINES
1130 threads:
30 standard node
1 supermem node
1 GPU node
150 To on 3 NAS + 210 To scratch
400+
Resources mutualised at Meso@LR through the
Mudis4Ls project (purchase/storage/data)
600+ tools
Collaborative development of tools
Metagenomic
Diversity exploration
Genomics
Pangenomic
Gene families
Comparative
Phylogeny
genotype manipulation
mosaic manipulation
Data mining
Annotation
Assemblies
packages (4)
workflows(5)
web applications (16)
+20 tools
visualisation (8)
bioinfo@ird.fr
Florian Charriat
Antoni Exbrayat
And more collaborators !
Bruno Granouillac
Jacques Dainat
Nicolas Fernandez
Guilhem Sempere
Thomas Denecker
Formation Python
Adapté du cours HLIN404 de Anne-Muriel Chiffoleau (UM)
Version 2023.1
Pourquoi programmer en Python ?
Qu'est-ce qu'un programme ou un script ?
Pourquoi apprendre à programmer ?
10
Pourquoi programmer en Python ?
Pourquoi en Python ?
=> Biopython : ensemble de fonctions et procédures conçues pour le traitement et l'analyse de données biologiques
Référence : http://python.developpez.com/tutoriels/cours-python-uni-paris7/
11
Utiliser Python sur le cluster de l’IRD
cd /scratch/ && mkdir formationXX_python && cd formationXX_python
12
Premiers pas
Le plus souvent utilisé : ipython
(interpréteur amélioré)
13
Sortir de l'interpréteur avec la commande quit() / exit() ou Ctrl+d
Premiers pas
Mode programmation / script
14
Utilisation de nano pour éditer des fichiers
nano : éditeur de fichier simple en ligne de commande.�Installé sur toutes les machines Linux.
nano unfichier.py �pour éditer un fichier existant ou créer un nouveau fichier
Sauvegarder et quitter : CTRL-X -> O -> Entrée
(les raccourcis sont affichés en bas de l'écran)
Chez vous, vous voudrez probablement utiliser un éditeur plus complet (vim, VS Code, Sublime Text…) ou un IDE (PyCharm, Spyder)
15
Avantage de PyCharm pour éditer des fichiers python
PyCharm : environnement de développement intégré (IDE) Utilisable sur Windows, Linux et Mac
Utilise l'auto complétion du code
gère l’indentation du code
Affiche des messages si erreur de syntaxe, propose les importations de librairie, analyse en temps réel du code, …
16
Utiliser Python avec PyCharm
17
Utiliser Python avec PyCharm
Pour ce cours : utiliser PyCharm
(interpréteur amélioré)
18
Les variables / typage
Variable : zone de mémoire dans laquelle on stocke une valeur�Une variable a un nom (ensemble de lettres, chiffres et _)
On déclare une variable en initialisant : x = 2�On peut changer sa valeur avec une affectation : x = x + 3
Python donne automatiquement un type a chaque variable en fonction de sa nature
19
Les variables > Manipulation
Sur les nombres : opérateurs mathématiques de base�+ - * / ** (puissance) % (modulo)
Sur les chaînes de caractères :�+ concaténation�* répétition
type(ma_variable) donne le type de la variable
Pas de conversion automatique ! (str + int ⇒ erreur) ex : "Bonjour" + 10
Solution:
Conversion : int(), float(), str()
20
Les variables > Nommage
Un nom de variable ne peut pas commencer par un chiffre.
Éviter de commencer avec un _
Les noms de variables sont sensibles à la case (test ≠ TEST)
Utiliser la convention snake_case (sauf noms de classes)
ma_longue_variable = 3
Ne pas utiliser un mot réservé comme nom (print, range, from, for, …)
Donnez des noms explicites à vos variables !
longueur_seq plutôt que l
21
Les fonctions
Les fonctions sont des blocs de code isolés, qui peuvent être appelés depuis n'importe où dans votre code.
Une fonction prend des arguments en entrée, et peut renvoyer une valeur de retour en sortie.
Syntaxe :�x = fonction(argument1, argument2)
On peut appeler une fonction un nombre illimité de fois. Une fonction peut elle-même appeler d'autres fonctions.
22
Un type spécifique : les classes/objets
Les classes sont les principaux outils de la programmation orientée objet.
Une classe peut comporter :
Une instance d'une classe est un objet
On peut appeler les attributs d'un objet en utilisant le . :�objet.attribut = 4 objet.méthode()
chaine = "Bonjour"
la variable chaine est en réalité une instance de la classe str.
Tous les types en python sont des objets
23
# création de l’instance ‘une_cerise’ de la classe Cerise()
une_cerise = Cerise()
# exemple d’attributs
une_cerise.couleur = rouge
une_cerise.taille = 2
# exemple d’une methode
une_cerise.enlever_noyau()
Examiner les objets / Obtenir de l’aide sur ...
help(obj) : Affiche la documentation. Fonctionne sur les modules, les objets et les fonctions.�Raccourci sur IPython : ?obj
dir(obj) : retourne la liste des attributs et méthodes de la classe de l’objet
24
>>> dir("")
[ 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format',
'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower',
'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans',
'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith',
'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
Entrées/sorties en console
Afficher du texte et des variables : print()
nom = “Sebastien"�print("Bonjour", nom)�(print ajoute un espace entre les éléments automatiquement. Modifiable avec le paramètre "sep")
Récupérer une information saisie par l'utilisateur : input()
nom = input("Quel est votre nom ? ")
25
Entrées/sorties > Affichage formaté
! Python >= 3.6
Pratique
Retrouvez les énoncés des exercices sur la page web de la formation :
�https://southgreenplatform.github.io/trainings/python/pythonPractice/
27
Pratique 1: le mode interactif
En mode interactif, demander à l'interpréteur de calculer
5*6
10/3
10.0/3.0
print("Hello world !")
Rappel mode interactif
ouvrir un terminal
lancer l'interpréteur python via la commande ipython
taper les instructions souhaitées
28
Pratique 1: premier script
Créer un programme python qui affiche "Hello world"
Créer un fichier hello.py avec votre éditeur de texte (nano, …)
Taper l'instruction print("Hello world") dans le fichier
Enregistrer le fichier
Dans le terminal, se déplacer dans le répertoire où se trouve mon script (commande cd …)
Exécuter le script en tapant la commande python3 hello.py
29
Exercice 1
Structures conditionnelles
Permet d'exécuter du code différent en fonction du résultat d'une ou plusieurs conditions/tests
30
if moyenne >= 10:� mention = "passable"�else:� mention = "ajourné"
si
sinon
condition
Indentation en Python
Contrairement à la plupart des autres langages, �les Blocs de code (conditions, boucles, fonctions…) définis par l'indentation
31
Plus d'indentation = fin du bloc de la condition
Convention : Indenter avec 4 espaces (pas de tabulations)
if variable == 1:� print("La condition est vraie !")� x = 3� # du code....��print("Ceci sera tout le temps affiché")
":" crée un nouveau bloc
Structures conditionnelles
32
if moyenne >= 12:� mention = "assez bien"
elif moyenne >= 10:
mention = "passable"�else:� mention = "ajourné"
si
sinon si
Condition 1
Condition 2
sinon
Structures conditionnelles > Tests
Opérateurs de comparaison
== égal à�!= différent de�> strictement supérieur à�>= supérieur ou égal à�< strictement inférieur à�<= inférieur ou égal à
is est le même objet que (utiliser pour vérification de type)
x = 3�if type(x) is int:
33
Attention !
Ne pas confondre :
= opérateur d'assignation
et
== opérateur de comparaison
Structures conditionnelles > Opérateurs logiques
Les opérateurs de comparaisons renvoient un booléen (bool)
On peut combiner plusieurs conditions avec les opérateurs logiques
and ET�or OU (inclusif)�not NON
34
True and True | True |
True and False | False |
False and True | False |
False and False | False |
True or True | True |
True or False | True |
False or True | True |
False or False | False |
not True | False |
not False | True |
age = 32
if age >= 4 and age <= 99:
print("Vous pouvez jouer aux legos")
Pratique 2: les tests
Créer un programme python exo2.py qui affiche la moyenne de 3 notes données par l'utilisateur.
Voici le code python3 pour demander 3 valeurs à l'utilisateur qui seront stockées dans les variables note1, note2, note3
note1 = input("Donner une note : ")
note2 = input("Donner une note : ")
note3 = input("Donner une note : ")
Attention les variables note1, note2, note3 sont de type chaîne de caractère (str)
Modifier ensuite le programme afin qu'il affiche
"ajourné" si la moyenne est inférieure à 10�"passable" si la moyenne est supérieure ou égale à 10�"assez bien" si la moyenne est supérieure ou égale à 12�"bien" si la moyenne est supérieure ou égale à 14�"très bien" si la moyenne est supérieure ou égale à 16
35
Exercice 2
Écrire l’algorithme en commentaire par exemple:
# on demande a l'utilisateur de rentrer 3 notes qu'on sauvegarde dans 3 variables
# on doit convertir les valeurs car la fonction input retourne des str()
Structures de données: Listes
Liste : structure de données contenant une série de valeurs ordonnées (possiblement de types différents)
ma_liste = [1, "deux", 3.0]
ma_liste_vide = []
Appeler les éléments d'une liste
ma_liste[0] premier élément de la liste�ma_liste[1] second élément de la liste
Attention : Les index commencent à 0 !
36
Listes
Récupérer la longueur d'une liste :
len(ma_liste)
Prendre une tranche d'une liste :
ma_liste[i:j] ⇒ éléments de l'indice i à l'indice j-1
ma_liste[i:] ⇒ tous les éléments à partir de l'indice i
ma_liste[:j] ⇒ tous les éléments jusqu'à l'indice j-1
ma_liste[:-1] ⇒ tous les éléments sauf le dernier
ma_liste[-1] ⇒ dernier élément
Concaténer des listes
liste_1 + liste_2
37
i,j = positions dans la liste x = valeur
Listes
Ajouter un élément à la fin d'une liste�ma_liste.append(x)
Remplacer la valeur d'un élément à une position déterminée�ma_liste[i] = x
Insérer un élément à une position déterminée�ma_liste.insert(i, x)
38
i,j = positions dans la liste x = valeur
Listes
Trier une liste en place� ma_liste.sort()
Créer une copie triée d'une liste� liste_triee = sorted(ma_liste)
Inverser une liste� ma_liste.reverse()
Supprimer un élément d'une liste� del ma_liste[i]� ma_liste.remove(x) (ne retire que la première occurrence de x)
Compter le nombre d'occurrences de x dans une liste� ma_liste.count(x)
39
i,j = positions dans la liste x = valeur
Listes
Tester si un élément appartient ou pas à une liste�if x in ma_liste:�if x not in ma_liste:
Attention : toutes les recherches par valeur dans la liste�sont en O(n)�= de plus en plus lentes au fur et à mesure que la taille de la liste augmente
40
i,j = positions dans la liste x = valeur
Listes
Une chaîne de caractères est une liste non modifiable�sequence = "ATGGCAT"�sequence[2] => "G"
On peut créer une liste modifiable à partir de la chaîne�liste_sequence = list(sequence)
Listes de listes
liste = [[1, 2, 3], [4, 5, 6]]�liste[0] => [1, 2, 3]�liste[0][0] => 1�liste[1][2] => 6
41
Boucles
On peut avoir besoin de répéter une action (un bloc de code) plusieurs fois
Exemples:
Pour cela on va "boucler".
Deux structure itératives : Pour (for) et Tant que (while)
42
Boucles > while (TANT QUE)
Tant que la condition est vraie, le bloc de code est exécuté
43
while condition:
instruction
...
expression conditionnelle (comme les if)
bloc de code qui sera exécuté tant que la condition est vraie
Le bloc d'instructions doit modifier la valeur de l'expression conditionnelle, sinon boucle infinie !
(rappel : CTRL+C pour arrêter un programme bloqué dans une boucle infinie)
modification de la valeur de i�⇒ modification de la valeur de l'expression conditionnelle
i = 1�while i <= 4:
print(i)
i = i + 1
instruction
expression conditionnelle (dépend de i)
Boucles > for (POUR)
Pour chaque élément d'un itérable, exécuter un bloc de code
(une liste est un exemple d'itérable)
44
for element in iterable:
� instruction� …
animaux = ["Lion", "Chèvre", "Vache"]
for animal in animaux:
print(animal)
variable qui contiendra chaque élément
itérable (ex. liste) duquel les éléments seront tirés
bloc de code (indenté) qui sera exécuté une fois pour chaque élément
Boucles > for (POUR)
Astuce : avoir en même temps la position et la valeur de l'élément
for position, element in enumerate(iterable):� print(f"Position {position} : {element}")
Attention : Ne pas modifier la liste sur laquelle on boucle !
45
Boucles > for (POUR)
Si on veut itérer sur un nombre croissant, on peut utiliser range :
range(fin) �Entiers de 0 à fin - 1�range(début, fin) �Entiers de début à fin - 1�range(début, fin, pas) �Entiers de début à fin - 1 tous les pas
Exemple : nombres pairs entre 2 et 12
for i in range(2, 14, 2):� print(i)
46
Boucles > Interruptions
Deux instructions qui permettent d'interrompre une boucle prématurément :
continue arrête l'exécution de l'itération en cours et passe à l'itération suivante
=> utile si on veut ignorer une variable particulière et passer directement à la suivante
break arrête l'exécution de l'itération en cours et sort de la boucle
=> utile par exemple si on cherche quelque chose et qu'on l'a trouvé
47
Boucles > Interruptions
ma_liste = ["machin", "truc", "chose"]
for element in ma_liste:
if element == "truc":
continue
print(element)
print("fini")
48
Boucles > Interruptions
ma_liste = ["machin", "truc", "chose"]
for element in ma_liste:
if element == "truc":
print(element)
break
print("fini")
49
Pratique 3: les listes et les boucles
Soit la liste suivante: liste_animaux = ['vache','souris','levure','bacterie']
Créer un programme python exo3_while.py qui affiche l’ensemble des éléments de liste liste_animaux en utilisant la boucle while
Créer un programme python exo3_for.py qui affiche l’ensemble des éléments de la liste liste_animaux en utilisant la boucle for
Soit la liste de nombres suivante: impairs = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21]
Créer un programme python exo4_pair.py qui, à partir de la liste impairs, construit une nouvelle liste pairs dans laquelle tous les éléments de impairs sont incrémentés de 1. Une fois la nouvelle liste créée, l'afficher.
50
Exercices 3 & 4
Pratique 4: les listes et les boucles suite
Créer un programme python exo5.py qui à partir de la séquence nucléique "TCTGTTAACCATCCACTTCG" (chaîne de caractères)
crée sa séquence complémentaire inverse, puis l'affiche.
Créer un programme python exo6.py qui compte le nombre de chacune des bases (A, T, G, C) présente dans la séquence nucléique "TCTGTTAACCATCCACTTCG", puis qui affiche ces nombres. Vous ferez une version qui utilise la fonction count() des listes et une autre version qui ne l'utilise pas.
Créer un programme python exo7.py qui vérifie si la sous-séquence "ATG" (codon start) est présente dans la séquence nucléique "TCTGTTATGACCATCCACTTCG", puis affiche "oui" ou "non" en fonction du résultat. Par la suite, modifier le programme pour qu'il affiche également la position de la sous-séquence "ATG" si elle est présente.
51
Exercices 5, 6 & 7
Pratique 4: les listes et les boucles suite
Reprendre l'un des programmes exo5.py, exo6.py ou exo7.py et faire en sorte qu'il fonctionne pour plusieurs séquences (les séquences seront stockées dans une liste et chacune des séquences sera analysée)
Exemple :
seq1= "ATGCGTAGTCGT"
seq2= "AGGTTCGTATG"
mesSeq = [seq1,seq2]
52
Exercice 7bis
Modules Python
Python met à disposition des modules qui contiennent des fonctions souvent utilisées ou pour interagir avec le système (modules = bibliothèques/librairies)
Utilisation d'un module :
53
Modules Python
Quelques modules de la librairie standard utiles :
Tous les modules de la librairie standard et leur documentation :�https://docs.python.org/3/library/index.html
54
Passage d'arguments
Exemples
55
note1 = input("Donner une note : ")
note2 = input("Donner une note : ")
note3 = input("Donner une note : ")
moy = (int(note1)+int(note3)+int(note2))/3
print ("La moyenne est ",moy)
On souhaite passer ces valeurs en argument au programme
Passage d'arguments
Exemples
56
liste_animaux = ['vache','souris','levure','bacterie']
for nom in listeAnimaux:
print(nom)
On souhaite passer ces valeurs en argument au programme
Passage d'arguments
Jusqu'à présent, on utilise des données fixes ou demandées à l'utilisateur avec input()
On veut passer des arguments/paramètres au programme
57
interpréteur
Script qui attend les arguments
argument du programme
(obligatoire ou avec valeur par default)
python3 exo3.py 15 17 8
Passage d'arguments
Récupérer les valeurs passées en argument au programme :�Utilisation de la liste sys.argv du module sys (import sys)
58
Exemple pour la commande python exo3.py 15 17 8
Passage d'arguments
Vérifier qu'on a le bon nombre d'arguments = taille de sys.argv
Si on a 3 arguments, alors len(sys.argv) == 4
59
Si on a pas le bon nombre, quitter le programme :
sys.exit()�sortie normale
sys.exit("Message d'erreur")�sortie avec erreur (met le code d'erreur du shell à 1)
Pratique 5: le passage de paramètre
60
Exercice 5bis
Pratique 5: le passage de paramètre
Exemple :
61
Exercice 8
Fichiers
Souvent en bioinfo, on doit lire ou écrire des fichiers
Ouvrir un fichier :�fd = open("nom_du_fichier", "mode d'ouverture")
62
Modes d'ouverture :
Python traite les fichiers comme des fichiers texte par défaut (encodage utf-8)
Fichiers
Souvent en bioinfo, on doit lire ou écrire des fichiers
Ouvrir un fichier :�fd = open("nom_du_fichier", "mode d'ouverture")
63
fd est un objet représentant le fichier ouvert sur lequel on peut appeler des fonctions pour manipuler le fichier
Une fois les manipulations finies, on doit impérativement fermer le fichier !
fd = open("fichier.txt", "r")�# ici instructions utilisant le fichier…�fd.close()�# ici on ne peut plus utiliser fd
Fichiers > Lecture
Lecture du fichier (fichier ouvert en mode "r")
Le fichier a un curseur qui avance à chaque opération de lecture.
64
Lire tout le fichier comme chaîne de caractères�chaine = fd.read()
Lire n caractères du fichier comme chaîne de caractères�chaine = fd.read(n)
Lire une ligne du fichier comme chaîne de caractères�ligne = fd.readline()
Lire toutes les lignes du fichier dans une liste�lignes = fd.readlines()
Pour revenir au début : fd.seek(0)
Fichiers > Lecture
Lecture du fichier (fichier ouvert en mode "r")
Lire le fichier ligne par ligne avec une boucle�for ligne in fd:� print(ligne)
(Équivalent d'une boucle utilisant fd.readline())
La boucle utilise le curseur du fichier de la même manière que les autres fonctions !
Attention : Les lignes lues par readline(), readlines() et la boucle for contiennent les sauts de ligne ("\n").
65
Fichiers > Écriture
Écriture dans un fichier (fichier ouvert en mode "w", "a" ou "x")
66
Écrire une chaîne de caractères�fd.write(chaine)�Attention : n'ajoute pas automatiquement le saut de ligne ("\n")
Écrire plusieurs lignes (liste de chaînes de caractère)�fd.writelines(liste)�Attention : n'ajoute pas non plus les sauts de ligne ("\n")
Fichiers
Ouverture du fichier avec with : fermeture automatique �
fd = open("fichier.txt", "r")�print(fd.read())�fd.close()
67
Fichier fermé automatiquement :
with open("fichier.txt", "r") as fd:
print(fd.read())
print("ici, le fichier a été fermé automatiquement")
Manipulation des chaînes de caractères
Découper une chaîne de caractères en liste d'éléments, en utilisant un séparateur (par défaut, espaces et tabulations)
liste = chaine.split(separateur)
animaux = "girafe tigre singe"�ma_liste = animaux.split()�print(ma_liste)��
=> ["girafe", "tigre", "singe"]
68
Manipulation des chaînes de caractères
Découper une chaîne de caractères en liste d'éléments, en utilisant un séparateur (par défaut, espaces et tabulations)
liste = chaine.split(separateur)
animaux = "girafe;tigre;singe"�ma_liste = animaux.split(";")�print(ma_liste)��
=> ["girafe", "tigre", "singe"]
69
Manipulation des chaînes de caractères
Mettre en MAJUSCULE/minuscule
chaine_majuscule = chaine.upper()�chaine_mijuscule = chaine.lower()�chaine_capitalisee = chaine.capitalize()
Convertir une liste de chaînes de caractères en une seule chaîne de caractères
chaine = "séparateur".join(liste)
liste = ["A", "T", "G", "CAAA"]�seq1 = "-".join(liste) => "A-T-G-CAA"�seq2 = "".join(liste) => "ATGCAA"�seq3 = " ".join(liste) => "A T G CAA"
70
Manipulation des chaînes de caractères
Supprimer certains caractères (donnés dans une chaine de caractères) des extrémités d'une chaîne de caractères �(par défaut : espaces, tabulations et sauts de ligne)
71
Pratique 6: Les fichiers
Voila une séquence au format fasta (sequence1.fasta)
>gi|374429558|ref|NR_046237.1| Rattus norvegicus 18S ribosomal RNA (Rn18s)
TACCTGGTTGATCCTGCCAGTAGCATATGCTTGTCTCAAAGATTAAGCCATGCATGTCTAAGTACGCACG
GCCGGTACAGTGAAACTGCGAATGGCTCATTAAATCAGTTATGGTTCCTTTGGTCGCTCGCTCCTCTCCT
Exemple d'affichage :
tacctggttgatcctgccagtagcatatgcttgtctcaaagattaagccatgcatgtctaagtacgcacg
gccggtacagtgaaactgcgaatggctcattaaatcagttatggttcctttggtcgctcgctcctctcct
acttggataactgtggtaattctagagctaatacatgccgacgggcgctgaccccccttcccgtgggggga
...
72
Exercices 9 & 10
Pratique 6: Les fichiers
Créer un programme python exo11.py qui permet de lire un fichier (dont le nom est passé en argument) contenant la séquence au format fasta et qui affiche une ligne sur 2 de la séquence fasta : ligne 1 puis 3 puis 5 …
Exemple d'affichage :
>gi|374429558|ref|NR_046237.1| Rattus norvegicus 18S ribosomal RNA (Rn18s)
GCCGGTACAGTGAAACTGCGAATGGCTCATTAAATCAGTTATGGTTCCTTTGGTCGCTCGCTCCTCTCCT
AACGCGTGCATTTATCAGATCAAAACCAACCCGGTCAGCCCCCTCCCGGCTCCGGCCGGGGGTCGGGCGC
73
Exercice 11
Pratique 6: Les fichiers
Details de l’en-tête d'une séquence au format fasta (sequence1.fasta)
>gi|374429558|ref|NR_046237.1| Rattus norvegicus 18S ribosomal RNA (Rn18s)
Exemple de fichier résultat :
>gi|374429558|ref|NR_046237.1| Rattus norvegicus 18S ribosomal RNA (Rn18s)
>gi|374429558|ref|NR_046237.1| Rattus norvegicus 18S ribosomal RNA (Rn18s)
>gi|374429558|ref|NR_046237.1| Rattus norvegicus 18S ribosomal RNA (Rn18s)
>gi|374429558|ref|NR_046237.1| Rattus norvegicus 18S ribosomal RNA (Rn18s)
74
Exercice 12
Pratique 6: Les fichiers
Créer un programme python exo13.py qui permet de lire un fichier (passé en argument) contenant plusieurs séquences au format fasta et qui crée un fichier résultat (passé en argument) qui devra contenir uniquement le numéro gi et le numéro d'accession de chaque séquence du fichier d'entrée.
Exemple de fichier résultat :
seq 1 => num gi : 374429558, num accession : NR_046237.1
seq 2 => num gi : 374429558, num accession : NR_046237.1
seq 3 => num gi : 374429558, num accession : NR_046237.1
75
Exercice 13
Pratique 6 : Les fichiers
Créer un programme exo14.py prend en argument un fichier tabulé contenant 2 colonnes numériques et écrit un nouveau fichier tabulé en sortie contenant les 2 colonnes originales et une 3ème colonne contenant leur somme�Les noms des fichiers d’entrée et de sortie doivent être pris en argument.�La première ligne du fichier tabulé est un en-tête, il faut juste ajouter le nom de la colonne supplémentaire “Somme”.�Un fichier d’entrée d’exemple “fichier_tabule.tsv” est disponible dans les données du cours.
Exemple d'entrée : Exemple de sortie :
Valeur_1 Valeur_2 Valeur_1 Valeur_2 Somme
5 10 5 10 15�3 22 3 22 25
76
Exercice 14
Dictionnaires
Un dictionnaire est une structure de données qui contient une collection non ordonnée (pas d'indice) de couples clé/valeur (pouvant être de types différents)
Déclaration�dico = {cle1: valeur1, cle2: valeur2, …}�dico_vide = {}
On accède aux valeurs d'un dictionnaire par ses clés�dico[cle]
77
Dictionnaires
Liste* des clés d'un dictionnaire : dico.keys()
Liste* des valeurs d'un dictionnaire : dico.values()
Liste* des couples clé/valeur d'un dictionnaire : dico.items()
for cle, valeur in dico.items():� print(f"La clé {cle} contient {valeur}")
78
* se comportent presque comme des listes mais n'en sont pas tout à fait. On peut obtenir une vraie liste en faisant :
list(dico.keys())
Dictionnaires
Longueur (nb. de couples) d'un dictionnaire�len(dico)�note : len fonctionne sur beaucoup de types qui ont une longueur : str, list, tuple, dict, set, range…
Tester l'existence d'une clé�if cle in dico retourne True si la clé existe
Modifier une valeur ou Ajouter un couple�(selon si la clé existe ou pas)�dico[cle] = valeur
Supprimer un couple�del dico[cle]
Vider un dictionnaire�dico.clear()
79
Pratique 7: Les dictionnaires
puis qui demande à l'utilisateur (fonction input()) d'entrer une base,
et enfin qui affiche si la base entrée par l'utilisateur est purinique ou pyrimidique
Votre programme doit afficher :
{'P': 2, 'I': 2, 'W': 3, 'G': 6, 'L': 3, 'A': 7, 'M': 1, 'S': 3}
80
Exercices 15 & 16
Pratique 7: Les dictionnaires
dico_espece = {'Escherichia coli':3.6,'Homo sapiens':3200,'Saccharomyces cerevisae':12,'Arabidopsis thaliana':125}
Créer un programme python exo17.py dans lequel vous créez ce dictionnaire et qui permet d'afficher le nom de l'organisme possédant le plus grand génome.
81
Exercice 17
Pratique 7: Les dictionnaires
Le fichier sequences_especes.tsv est un fichier tabulé (2 colonnes séparées par des tabulations) contenant un identifiant de séquence dans la première colonne, et l’espèce associée dans la secondes colonne.
Homo sapiens 27292
Saccharomyces cerevisiae S288C 850883
Homo sapiens 55226
Mus musculus 19791
Créez un script exo18.py lit ce fichier et, à l’aide d’un dictionnaire, écrit un fichier de sortie qui contient le nom d’une espèce précédé d’un dièze sur une ligne puis tous les identifiants de séquence associés à cette espèce sur les lignes suivantes.
# Homo sapiens�27292�55226�....�# Saccharomyces cerevisiae S288C�850883�....
82
Exercice 18
Biopython
Librairie contenant un ensemble d'objets et de fonctions dédiés à la manipulation des données de biologie moléculaire
Importer les objets Biopython :
from Bio.Seq import Seq, SeqRecord Objets Séquence�from Bio import SeqIO Entrée Sortie Séquence�from Bio import AlignIO Entrée/Sortie Alignements
83
Biopython > Séquences
Objet Seq : séquence (suite de bases) + alphabet
L'alphabet définit le type de la séquence : ADN, Protéine, ARN...
from Bio import Seq�ma_sequence = Seq("ATTGCGCGAG")
84
Construit un objet Seq
Séquence de l'objet Seq
alphabet non précisé = alphabet générique
Objet Seq("ATTGCGCGAG")
Biopython > Séquences
Objet Seq : séquence (suite de bases) + alphabet
L'alphabet définit le type de la séquence : ADN, Protéine, ARN...
from Bio import Seq�ma_sequence = Seq("ATTGCGCGAG")
Parfois utile de spécifier l'alphabet : �DNAAlphabet(), ProteinAlphabet(), RNAAlphabet()
from Bio.Seq import Seq�from Bio.Alphabet import ProteinAlphabet�ma_sequence = Seq("ACGHA", ProteinAlphabet())
85
Biopython > Séquences
L'object Seq se comporte comme une chaîne de caractères�(= liste non modifiable)
86
Biopython > Séquences
L'object Seq se comporte comme une chaîne de caractères�(= liste non modifiable)
87
Biopython > Séquences
Seq fournit aussi des fonctions spécifiques :
88
Biopython > SeqRecord
Objet SeqRecord : Seq + identifiants + description + informations optionnelles (annotations et features)
from Bio.SeqRecord import SeqRecord
Attributs :
89
Biopython > SeqRecord
Objet SeqRecord : Seq + identifiants + description + informations optionnelles (annotations et features)
from Bio.Seq import Seq�from Bio.SeqRecord import SeqRecord�mon_record = SeqRecord(Seq("ATAGC"), id="mySeq", description="test")�mon_record.name = "maSeq"
90
Biopython > SeqIO > Lecture
SeqIO : Ensemble de fonctions pour la lecture et écriture de séquences sous différents formats (fasta/q, GenBank, EMBL…)
from Bio import SeqIO
Les fonctions de SeqIO retournent des objets SeqRecord
Lire un fichier avec UNE séquence : �SeqIO.read(chemin/objet fichier, format)
�from Bio import SeqIO�mon_record = SeqIO.read("seq.fasta", "fasta")
Renvoie un SeqRecord
91
Biopython > SeqIO > Lecture
Lire un fichier avec PLUSIEURS séquences : �SeqIO.parse(chemin/objet fichier, format)
Renvoie un itérateur de SeqRecord
from Bio import SeqIO�for mon_record in SeqIO� print(mon_record.id)
attention : on ne peut parcourir l'itérateur qu'une seule fois
Récupérer toutes les séquences dans une liste :�liste_records = list(SeqIO.parse(chemin, format)
Récupérer toutes les séquences dans un dictionnaire dont les�clés sont les id des SeqRecord :�dico_records = SeqIO.to_dict(SeqIO.parse(chemin, format))
92
Biopython > SeqIO > Écriture
Obtenir une séquence dans un format choisi à partir�d'un SeqRecord :�record.format(format)�
Écrire un SeqRecord dans un fichier :�fd.write(record.format("fasta"))
Écrire un ensemble de SeqRecord dans un fichier :
SeqIO.write(liste_seqrecords, chemin, format)
93
Biopython > SeqIO > Conversion
Convertir des séquences d'un format à un autre directement
SeqIO.convert(chemin_in, format_in, chemin_out, format_out)
(Renvoie le nombre de séquences converties)
94
Pratique 8: bioPython Seq, SeqRecord et SeqIO
On va travailler sur le fichier GenBank rattus.gb (dossier de données)
95
Exercices 19, 20 & 21
Biopython > Récupérer des Séquences
Interroger les bases de données et télécharger des séquences
Ici on s'intéresse au BDD du NCBI (ex portail Entrez)
from Bio import Entrez
Important : préciser un email (conditions d'utilisation du NCBI)
Entrez.email = "votre@email.fr"
96
Biopython > Récupérer des Séquences
1. Effectuer une requête sur une base de données
fic_XML = Entrez.esearch(db=nom_db, term=requete, …)
Renvoie le résultat sous la forme d'un fichier XML ouvert
2. Parser le résultat dans un dictionnaire
dic_resultat = Entrez.read(fic_XML)
Identifiants des séquences : dico_resultat["IdList"]
97
Biopython > Récupérer des Séquences
3. Télécharger les séquences à partir des identifiants
fic_sequences = Entrez.efetch(� db=nom_db,� id=dic_resultat["IdList"],� rettype=format�)
Renvoie un objet fichier ouvert, à lire avec SeqIO.read() ou SeqIO.parse().
4. Penser à fermer les fichiers une fois qu'on a fini
fic_XML.close()�fic_sequences.close()
98
Biopython > Documentation
Quelques liens utiles pour utiliser Biopython
Cookbook : tutoriaux sur les différents composants�https://biopython.org/DIST/docs/tutorial/Tutorial.html�https://biopython.org/wiki/Category%3ACookbook
API documentation : documentation complète de tous les objets et fonctions�http://biopython.org/DIST/docs/api/
Un article/tutoriel en français�https://connect.ed-diamond.com/GNU-Linux-Magazine/GLMFHS-073/La-bioinformatique-avec-Biopython
99
Pratique 8bis: bioPython, récupération de séquences
100
Exercices 22 & 23
Pratique 8bis: bioPython, récupération de séquences
101
Exercice 24
Exécuter d'autres programmes : subprocess
On peut vouloir appeler un programme extérieur depuis notre script et récupérer sa sortie
Module subprocess (import subprocess)
Commande à donner sous forme de liste de chaînes de caractères, chaque argument étant une nouvelle chaîne.
Ajouter l'option stdout pour capturer la sortie et text pour automatiquement la décoder (comme à l'ouverture d'un fichier).
Renvoie un objet CompletedProcess, la sortie est accessible sur l'argument .stdout
102
! Python >= 3.5
Exécuter d'autres programmes : subprocess
On peut vouloir appeler un programme extérieur depuis notre script et récupérer sa sortie
Module subprocess (import subprocess)
import subprocess�commande = ["programme", "argument1", "argument2"...]�process = subprocess.run(� commande,� stdout=subprocess.PIPE,� text=True�)�print(process.stdout)
103
! Python >= 3.5
Exécuter d'autres programmes : subprocess
Arguments de subprocess utiles :
104
Exécuter d'autres programmes : subprocess
105
Bonus : Vos propres fonctions
Écrire vos propres fonctions vous permet de rendre un bloc de code réutilisable depuis n'importe où dans votre script, autant de fois que nécessaire.
Avantages :
106
Bonus : Vos propres fonctions
Syntaxe
def nom_de_la_fonction(argument_1, argument2):� # instructions…� return valeur_de_retour
Note : les variables déclarées dans la fonction ne sont pas accessibles depuis l'extérieur (sauf la valeur de retour)
def fonction():� x = 3��print(x) # Erreur !!
107
Pratique def: créer mes propres fonctions
Créer un programme python exo-def.py qui prend en input une séquence texte et un motif (GC ou AT ou autre)
Le programme doit contenir une fonction valide qui vérifie que la séquence donnée par l’utilisateur est correcte et qui retourne un boolean (True ou False).
Si la séquence input est valide alors calcule le % du motif passé par l’utilisateur dans une deuxième fonction pourcentage.
Le programme doit retourner la phrase suivante:
La séquence S est valide et le % du motif M est X%.
108
Exercices BONUS
Modules utiles
Dans la librairie standard (préinstallés) :
Tous les modules de la librairie standard et leur documentation :�https://docs.python.org/3/library/index.html
109
Modules (tiers) utiles
Calcul scientifique optimisé (matrices, arrays, …)
Manipuler les données sous forme de DataFrames (tableaux)
Génération de graphiques :
Requêtes HTTP (web)
110
Quelques librairies tierces utiles
Outils de machine learning/statistiques avancées
Réseau
Interpréteur amélioré
Notebooks interactifs à la Rmarkdown
111
Quelques librairies tierces utiles
Parsing de formats de bioinformatique
FASTA, FASTQ, GB (BLAST, formats d'alignement ésotériques)
SAM, BAM, CRAM (VCF)
GFF
Visualisation
112
pandas (series)
Series correspond à un vecteur à une dimension
Syntaxe
import pandas as pd
>>> s = pd.Series([10, 20, 30, 40], index = ['a', 'b', 'c', 'd'])
>>> s
a 10
b 20
c 30
d 40
dtype: int64
Chaque élément de la série de données possède une étiquette qui permet d'appeler les éléments
>>> s[0]
10
>>> s["a"]
10
113
pandas (series)
Series correspond à un vecteur à une dimension
Syntaxe
>>> import pandas as pd
>>> s = pd.Series([10, 20, 30, 40], index = ['a', 'b', 'c', 'd'])
>>> s
a 10
b 20
c 30
d 40
dtype: int64
on peut extraire plusieurs éléments, par leurs indices ou leurs étiquettes
>>> s[[1, 3]]
b 20
d 40
dtype: int64
>>> s[["b", "d"]]
b 20
d 40
dtype: int64
114
pandas (series)
Series correspond à un vecteur à une dimension
Syntaxe
import pandas as pd
>>> s = pd.Series([10, 20, 30, 40], index = ['a', 'b', 'c', 'd'])
>>> s
a 10
b 20
c 30
d 40
dtype: int64
Les étiquettes permettent de modifier et d'ajouter des éléments
>>> s["c"] = 300
>>> s["z"] = 50
>>> s
a 10
b 20
c 300
d 40
z 50
dtype: int64
115
pandas (series)
Series correspond à un vecteur à une dimension
Syntaxe
on peut filtrer une partie de la series :
>>> s[s>30]
c 300
d 40
z 50
dtype: int64
et même combiner plusieurs critères de sélection :
>>> s[(s>20) & (s<100)]
d 40
z 50
dtype: int64
116
pandas (dataframe)
Dataframe correspondent à des tableaux à deux dimensions avec des étiquettes pour nommer les lignes et les colonnes.
Création
Voici comment créer un dataframe avec pandas à partir de données fournies comme liste de lignes :
>>> df = pd.DataFrame(columns=["a", "b", "c", "d"],
... index=["chat", "singe", "souris"],
... data=[np.arange(10, 14),
... np.arange(20, 24),
... np.arange(30, 34)])
>>> df
a b c d
chat 10 11 12 13
singe 20 21 22 23
souris 30 31 32 33
117
pandas (dataframe)
Création
Le même dataframe peut aussi être créé à partir des valeurs fournies en colonnes sous la forme d'un dictionnaire :
>>> data = {"a": np.arange(10, 40, 10),
... "b": np.arange(11, 40, 10),
... "c": np.arange(12, 40, 10),
... "d": np.arange(13, 40, 10)}
>>> df = pd.DataFrame(data)
>>> df.index = ["chat", "singe", "souris"]
>>> df
a b c d
chat 10 11 12 13
singe 20 21 22 23
souris 30 31 32 33
118
pandas (dataframe)
Création from csv
Une fonctionnalité très intéressante de pandas est d'ouvrir très facilement un fichier au format .csv :
>>> import pandas as pd
>>> df = pd.read_csv("mon_fichier.csv")
>>> df = pd.read_csv("mon_fichier.csv", index_col="ID")
>>> df.head()
>>> df.shape
# quel est le type de c/colonne
>>> df.dtypes
119
Pratique Pandas: importer un fichier csv et le explorer
Jupyter notebook
120
Exercices BONUS
Pratique Pandas: importer un fichier csv et le explorer
Créer un programme python exo-pandas-explo.py qui prenne en input le fichier suivant.
https://python.sdv.univ-paris-diderot.fr/data-files/transferrin_report.csv
Lire le fichier avec pd.read_csv et calculer quelques statistiques descriptives pour les données numériques avec la méthode .describe()
La colonne “Source” contient des chaînes de caractères, on peut rapidement déterminer le nombre de protéines pour chaque organisme
121
Exercices BONUS
pandas (dataframe propietés)
Proprietés
Les dimensions d'un dataframe sont données par l'attribut .shape (ligne/colonne:
>>> df.shape l'attribut
(3, 4)
La méthode .head(n) renvoie les n premières lignes du dataframe (par défaut, n vaut 5) :
>>> df.head(2)
L'attribut .columns renvoie le nom des colonnes et permet aussi de renommer les colonnes
>>> df.columns
Index(['a', 'b', 'c', 'd'], dtype='object')
>>> df.columns = ["Paris", "Lyon", "Nantes", "Pau"]
>>> df
Paris Lyon Nantes Pau
chat 10 11 12 13
singe 20 21 22 23
souris 30 31 32 33
122
pandas (dataframe selection)
Sélection de colonnes
On peut sélectionner une colonne par son étiquette :
>>> df["Lyon"]
chat 11
singe 21
souris 31
ou plusieurs colonnes en même temps :
>>> df[["Lyon", "Pau"]]
Lyon Pau
chat 11 13
singe 21 23
souris 31 33
123
pandas (dataframe selection)
Sélection de lignes
Pour sélectionner une ligne, il faut utiliser l'instruction .loc() et l'étiquette de la ligne :
>>> df.loc["singe"]
Paris 20
Lyon 21
Nantes 22
Pau 23
Name: singe, dtype: int64
Ici aussi, on peut sélectionner plusieurs lignes :
>>> df.loc[["singe", "chat"]]
Paris Lyon Nantes Pau
singe 20 21 22 23
chat 10 11 12 13
124
pandas (dataframe selection)
Sélection de lignes
Enfin, on peut aussi sélectionner des lignes avec l'instruction .iloc et l'indice de la ligne (la première ligne ayant l'indice 0) :
>>> df.iloc[1]
Paris 20
Lyon 21
Nantes 22
Pau 23
Name: singe, dtype: int64
>>> df.iloc[[1,0]]
Paris Lyon Nantes Pau
singe 20 21 22 23
chat 10 11 12 13
On peut également utiliser les tranches (comme pour les listes) :
>>> df.iloc[0:2]
Paris Lyon Nantes Pau
chat 10 11 12 13
singe 20 21 22 23
125
pandas (dataframe selection)
Sélection de lignes ET colonnes
On peut combiner les deux types de sélection (en ligne et en colonne):
>>> df.loc["souris", "Pau"]
33
>>> df.loc[["singe", "souris"], ['Nantes', 'Lyon']]
Nantes Lyon
singe 22 21
souris 32 31
126
pandas (dataframe selection)
Sélection par condition
Sélectionnons maintenant toutes les lignes pour lesquelles les effectifs à Pau sont > à 15
>>> df[ df["Pau"]>15 ]
De cette sélection, on ne souhaite garder que les valeurs pour Lyon :
>>> df[ df["Pau"]>15 ]["Lyon"]
On peut aussi combiner plusieurs conditions avec & pour l'opérateur et :
>>> df[ (df["Pau"]>15) & (df["Lyon"]>25) ]
et | pour l'opérateur ou :
>>> df[ (df["Pau"]>15) | (df["Lyon"]>25) ]
127
Pratique Pandas: Statistiques par groupe
Créer un programme python exo-pandas-stats.py qui prenne en input le fichier transferrin_report.csv et qui calcule la taille et la masse moléculaire moyennes des transferrines
Calcule la valeur minimale et maximale de la longueur et de la masse moléculaire
128
Exercices BONUS
pandas (Combinaison de dataframes)
Combinaison de dataframes
df1
Lyon Paris
chat 10 3
singe 23 15
souris 17 20
df2
Nantes Strasbourg
chat 3 5
souris 9 10
lapin 14 8
pour concatener les deux df
>>>pd.concat([df1, df2])
pour les concatener mais en mettant en commun les lignes des deux df
>>> pd.concat([df1, df2], axis=1)
conserver que les lignes communes aux deux dataframes
>>> pd.concat([df1, df2], axis=1, join="inner")
129
Pratique Pandas: concatener
Créer un programme python exo-pandas-concatener.py qui cree les deux df
df1
Lyon Paris
chat 10 3
singe 23 15
souris 17 20
df2
Nantes Strasbourg
chat 3 5
souris 9 10
lapin 14 8
et qui les concatene !
130
Exercices BONUS
pandas
131
Tous les exemples de ce cours pour la partie pandas ont été pris du cours de python de Patrick Fuchs et Pierre Poulain !! https://python.sdv.univ-paris-diderot.fr/17_modules_interet_bioinfo/#174-module-pandas
Formateurs
D’après un support de cours créé par
Anne-Muriel Chiffoleau (UM)
Merci pour votre attention !
Le matériel pédagogique utilisé pour ces enseignements est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions (BY-NC-SA) 4.0 International:
http://creativecommons.org/licenses/by-nc-sa/4.0/
SUIVEZ NOUS SUR TWITTER !
Merci de prendre 5 min pour remplir l’enquête
N’oubliez pas de nous citer !
Comment citer les clusters?
"The authors acknowledge the IRD i-Trop HPC at IRD Montpellier for providing HPC resources that have contributed to the research results reported within this paper. URL: http://bioinfo.ird.fr/ "
“The authors acknowledge the CIRAD UMR-AGAP HPC (South Green Platform) at CIRAD montpellier for providing HPC resources that have contributed to the research results reported within this paper. URL:
http://www.southgreen.fr”