A Quelques formats de données rencontrés en biologie
A.1 FASTA
Le format FASTA est utilisé pour stocker une ou plusieurs séquences, d'ADN, d'ARN ou de protéines.
Ces séquences sont classiquement représentées sous la forme :
1 2 3 4 5 6 |
|
La première ligne débute par le caractère >
et contient une description de la séquence. On appelle souvent cette ligne « ligne de description » ou « ligne de commentaire ».
Les lignes suivantes contiennent la séquence à proprement dite, mais avec un nombre maximum fixe de caractères par ligne. Ce nombre maximum est généralement fixé à 60, 70 ou 80 caractères. Une séquence de plusieurs centaines de bases ou de résidus est donc répartie sur plusieurs lignes.
Un fichier est dit multifasta lorsqu'il contient plusieurs séquences au format FASTA, les unes à la suite des autres.
Les fichiers contenant une ou plusieurs séquences au format FASTA portent la plupart du temps l'extension .fasta
mais on trouve également .seq
, .fas
, .fna
ou .faa
.
A.1.1 Exemples
La séquence protéique au format FASTA de la sous-unité \beta de l'hémoglobine humaine, extraite de la base de données UniProt, est :
1 2 3 4 |
|
La première ligne contient la description de la séquence (Hemoglobin subunit beta), le type de base de données (ici sp qui signifie Swiss-Prot), son identifiant (P68871) et son nom (HBB_HUMAN) dans cette base de données, ainsi que d'autres informations (S=Homo sapiens OX=9606 GN=HBB PE=1 SV=2).
Les lignes suivantes contiennent la séquence sur des lignes ne dépassant pas, ici, 60 caractères. La séquence de la sous-unité \beta de l'hémoglobine humaine est composée de 147 acides aminés, soit deux lignes de 60 caractères et une troisième de 27 caractères.
UniProt est une base de données de séquences de protéines. Ces séquences proviennent elles-mêmes de deux autres bases de données : Swiss-Prot (où les séquences sont annotées manuellement) et TrEMBL (où les séquences sont annotées automatiquement).
Voici maintenant la séquence nucléique (ARN), au format FASTA, de l'insuline humaine, extraite de la base de données GenBank :
1 2 3 4 5 6 |
|
On retrouve sur la première ligne la description de la séquence (Homo sapiens insulin mRNA), ainsi que son identifiant (BT006808.1) dans la base de données GenBank.
Les lignes suivantes contiennent les 333 bases de la séquence, réparties sur cinq lignes de 70 caractères maximum. Il est curieux de trouver la base T (thymine) dans une séquence d'ARN qui ne devrait contenir normalement que les bases A, U, G et C. Ici, la représentation d'une séquence d'ARN avec les bases de l'ADN est une convention.
Pour terminer, voici trois séquences protéiques, au format FASTA, qui correspondent à l'insuline chez humaine (Homo sapiens), féline (Felis catus) et bovine (Bos taurus) :
1 2 3 4 5 6 7 8 9 |
|
Ces séquences proviennent de la base de données UniProt et sont téléchargeables en suivant ce lien.
Chaque séquence est délimitée par la ligne d'en-tête qui débute par >
.
A.1.2 Manipulation avec Python
À partir de l'exemple précédent des 3 séquences d'insuline, voici un exemple de code qui lit un fichier FASTA avec Python :
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Pour chaque séquence lue dans le fichier FASTA, on affiche son identifiant et son nom puis les 30 premiers résidus de sa séquence :
1 2 3 4 5 6 |
|
Notez que les protéines sont stockées dans un dictionnaire (prot_dict
) où les clefs sont les identifiants et les valeurs les séquences.
On peut faire la même chose avec le module Biopython :
1 2 3 4 5 |
|
Cela produit le même résultat. L'utilisation de Biopython rend le code plus compacte car on utilise ici la fonction SeqIO.parse()
qui s'occupe de lire le fichier FASTA.
A.2 GenBank
GenBank est une banque de séquences nucléiques. Le format de fichier associé contient l'information nécessaire pour décrire un gène ou une portion d'un génome. Les fichiers GenBank porte le plus souvent l'extension .gbk
.
Le format GenBank est décrit de manière très complète sur le site du NCBI. En voici néanmoins les principaux éléments avec l'exemple du gène qui code pour la trypsine chez l'Homme.
A.2.1 L'en-tête
1 2 3 4 5 6 7 8 9 10 11 |
|
Ligne 1 (LOCUS
) : le nom du locus (HUMTRPSGNA), la taille du gène (800 paires de base), le type de molécule (ARN messager).
Ligne 3 (ACCESSION
) : l'identifiant de la séquence (M22612).
Ligne 4 (VERSION
) : la version de la séquence (M22612.1). Le nombre qui est séparé de l'identifiant de la séquence par un point est incrémenté pour chaque nouvelle version de la fiche GenBank. Ici .1 indique que nous en sommes à la première version.
Ligne 6 (SOURCE
) : la provenance de la séquence. Souvent l'organisme d'origine.
Ligne 7 (ORGANISME
) : le nom scientifique de l'organisme, suivi de sa taxonomie (lignes 8 à 10).
A.2.2 Les features
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
Ligne 9 (gene 1..800
) : la délimitation du gène. Ici de la base 1 à la base 800. Par ailleurs, la notation <x..y
indique que la séquence est partielle sur l'extrémité 5'. Réciproquement, x..y>
indique que la séquence est partielle sur l'extrémité 3'. Enfin, pour les séquences d'ADN, la notation complement(x..y)
indique que le gène se trouve de la base x à la base y, mais sur le brin complémentaire.
Ligne 10 (/gene="TRY1"
) : le nom du gène.
Ligne 11 (CDS 7..750
) : la délimitation de la séquence codante.
Ligne 14 (/product="trypsinogen"
) : le nom de la protéine produite.
Ligne 17 à 20 (/translation="MNPLLIL...
) : la séquence protéique issue de la traduction de la séquence codante.
Ligne 22 (sig_peptide 7..51
) : la délimitation du peptide signal.
A.2.3 La séquence
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
La séquence est contenue entre les balises ORIGIN
(ligne 2) et //
(ligne 17).
Chaque ligne est composée d'une série d'espaces, puis du numéro du premier nucléotide de la ligne, puis d'au plus 6 blocs de 10 nucléotides. Chaque bloc est précédé d'un espace.
Par exemple, ligne 10, le premier nucléotide de la ligne (t
) est le numéro 421 dans la séquence.
A.2.4 Manipulation avec Python
À partir de l'exemple précédent, voici comment lire un fichier GenBank avec Python et le module Biopython :
1 2 3 4 5 6 |
|
Pour la séquence lue dans le fichier GenBank, on affiche son identifiant, sa description et les 60 premiers résidus :
1 2 3 |
|
Il est également possible de lire un fichier GenBank sans le module Biopython. Une activité dédiée est proposée dans le chapitre 22 Mini-projets.
A.3 PDB
La Protein Data Bank (PDB) est une banque de données qui contient les structures de biomacromolécules (protéines, ADN, ARN, virus...). Historiquement, le format de fichier qui y est associé est le PDB, dont une documentation détaillée est disponible sur le site éponyme. Les principales extensions de fichier pour ce format de données sont .ent
et surtout .pdb
.
Un fichier PDB est constitué de deux parties principales : l'en-tête et les coordonnées. L'en-tête est lisible et utilisable par un être humain (et aussi par une machine). À l'inverse les coordonnées sont surtout utilisables par un programme pour calculer certaines propriétés de la structure ou simplement la représenter sur l'écran d'un ordinateur. Bien sûr, un utilisateur expérimenté peut parfaitement jeter un œil à cette seconde partie.
Examinons ces deux parties avec la trypsine bovine.
A.3.1 En-tête
Pour la trypsine bovine, l'en-tête compte 510 lignes. En voici quelques unes :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
Ligne 1. Cette ligne HEADER
contient le nom de la protéine (HYDROLASE (SERINE PROTEINASE)), la date de dépôt de cette structure dans la banque de données (26 octobre 1981) et l'identifiant de la structure dans la PDB, on parle souvent de « code PDB » (2PTN).
Ligne 2. TITLE
correspond au titre de l'article scientifique dans lequel a été publié cette structure.
Lignes 4-6. COMPND
indique que la trypsine est composée d'une seule chaîne peptidique, appelée ici A
.
Ligne 8. SOURCE
indique le nom scientifique de l'organisme dont provient cette protéine (ici, le bœuf).
Ligne 10. EXPDTA
précise la technique expérimentale employée pour déterminer cette structure. Ici, la cristallographie aux rayons X. Mais on peut également trouver SOLUTION NMR pour de la résonance magnétique nucléaire en solution, ELECTRON MICROSCOPY pour de la microscopie électronique...
Ligne 12. REMARK 2
précise, dans le cas d'une détermination par cristallographie aux rayons X, la résolution obtenue, ici 1,55 Angströms.
Ligne 14. DBREF
indique les liens éventuels vers d'autres banques de données. Ici, l'identifiant correspondant à cette protéine dans UniProt (UNP) est P00760.
Ligne 15-18. SEQRES
donnent à la séquence de la protéine. Les résidus sont représentés par leur code à 3 lettres.
Lignes 20-22 et 23-24. HELIX
et SHEET
correspondent aux structures secondaires hélices \alpha et brin \beta de cette protéine. Ici, H1 SER A 164 ILE A 176 indique qu'il y a une première hélice \alpha (H1) comprise entre les résidus Ser164 et Ile176 de la chaîne A.
Lignes 26-27. SSBOND
indique les bonds disulfures. Ici, entre les résidus Cys22 et Cys157 et entre les résidus Cys42 et Cys58.
A.3.2 Coordonnées
Avec la même protéine, la partie coordonnées représente plus de 1700 lignes. En voici quelques unes correspondantes au résidu leucine 99 :
1 2 3 4 5 6 7 8 9 10 |
|
Chaque ligne correspond à un atome et débute par ATOM
ou HETATM
.
ATOM
désigne un atome de la structure de la biomolécule.
HETATM
est utilisé pour les atomes qui ne sont pas une biomolécule, comme les ions ou les molécules d'eau.
Toutes les lignes de coordonnées ont sensiblement le même format. Par exemple, pour la première ligne :
ATOM
(ouHETATM
).601
: le numéro de l'atome.N
: le nom de l'atome. Ici, un atome d'azote du squelette peptidique. La structure complète du résidu leucine est représentée figure 1.LEU
: le résidu dont fait partie l'atome. Ici une leucine.A
: le nom de la chaîne peptidique.99
: le numéro du résidu dans la protéine.10.007
: la coordonnées x de l'atome.19.687
: la coordonnées y de l'atome.17.536
: la coordonnées z de l'atome.1.00
: le facteur d'occupation, c'est-à-dire la probabilité de trouver l'atome à cette position dans l'espace en moyenne. Cette probabilité est inférieure à 1 lorsque, expérimentalement, on n'a pas pu déterminer avec une totale certitude la position de l'atome. Par exemple dans le cas d'un atome très mobile dans une structure, qui est déterminé comme étant à deux positions possibles, chaque position aura alors la probabilité 0,50.12.25
: le facteur de température qui est proportionnel à la mobilité de l'atome dans l'espace. Les atomes situés en périphérie d'une structure sont souvent plus mobiles que ceux situés au coeur de la structure.N
: l'élément chimique de l'atome. Ici, l'azote.
Une documentation plus complète des différents champs qui constituent une ligne de coordonnées atomiques se trouve sur le site de la PDB.
Les résidus sont ensuite décrits les uns après les autres, atome par atome. Voici par exemple les premiers résidus de la trypsine bovine :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Vous remarquez que le numéro du premier résidu est 16 et non pas 1. Cela s'explique par la technique expérimentale utilisée qui n'a pas permis de déterminer la structure des 15 premiers résidus.
La structure de la trypsine bovine n'est constituée que d'une seule chaîne peptidique (notée A
).
Lorsqu'une structure est composée de plusieurs chaînes, comme dans le cas de la structure du récepteur GABAB 1 et 2 chez la drosophile (code PDB 5X9X) :
1 2 3 4 5 6 7 8 9 |
|
La première chaîne est notée A
et la seconde B
. La séparation entre
les deux est marquée par la ligne TER 765 ALA A 44
.
Dans un fichier PDB, chaque structure porte un nom de chaîne différent.
Enfin, lorsque la structure est déterminée par RMN, il est possible que plusieurs structures soient présentes dans le même fichier PDB. Toutes ces structures, ou « modèles », sont des solutions possibles du jeu de contraintes mesurées expérimentalement en RMN. Voici un exemple, toujours pour la structure du récepteur GABAB 1 et 2 chez la drosophile :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Chaque structure est encadrée par les lignes
1 |
|
et
1 |
|
où n est le numéro du modèle. Pour la structure du récepteur GABAB 1 et 2, il y a 20 modèles de décrits dans le fichier PDB.
A.3.3 Manipulation avec Python
Le module Biopython peut également lire un fichier PDB.
Chargement de la structure de la trypsine bovine :
1 2 3 4 5 |
|
Les fichiers PDB sont parfois (très) mal formatés. Si Biopython ne parvient pas à lire un tel fichier,
remplacez alors la 2e ligne par parser = PDBParser(PERMISSIVE=1)
. Soyez néanmoins très prudent quant aux résultats obtenus.
Affichage du nom de la structure et de la technique expérimentale utilisée pour déterminer la structure :
1 2 |
|
ce qui produit :
1 2 |
|
Extraction des coordonnées de l'atome N
du résidu Ile16 et de l'atome CA
du résidu Val17 :
1 2 3 4 5 6 |
|
ce qui produit :
1 2 |
|
L'objet res1["N"].coord
est un array de NumPy (voir le chapitre 17
Quelques modules d'intérêt en bioinformatique). On peut alors obtenir
simplement les coordonnées x, y et z d'un atome :
1 |
|
ce qui produit :
1 |
|
Biopython utilise la hiérarchie suivante :
structure > model > chain > residue > atom
même lorsque la structure ne contient qu'un seul modèle. C'est d'ailleurs
le cas ici, puisque la structure
a été obtenue par cristallographie aux rayons X.
Enfin, pour afficher les coordonnées des carbones \alpha (notés CA
) des 10 premiers résidus (à partir du résidu 16 car c'est le premier résidu dont on connaît la structure) :
1 2 3 4 5 6 |
|
avec pour résultat :
1 2 3 4 5 6 7 8 9 10 |
|
Il est aussi très intéressant (et formateur) d'écrire son propre parser de fichier PDB,
c'est-à-dire un programme qui lit un fichier PDB (sans le module Biopython).
Dans ce cas, la figure 2 vous aidera à déterminer comment extraire
les différentes informations d'une ligne de coordonnées ATOM
ou HETATM
.
Exemple : pour extraire le nom du résidu, il faut isoler le contenu des colonnes 18 à 20 du fichier PDB, ce qui correspond aux index de 17 à 19 pour une chaîne de caractères en Python, soit la tranche de chaîne de caractères [17:20]
car la première borne est incluse et la seconde exclue.
Pour lire le fichier PDB de la trypsine bovine (2PTN.pdb
) et extraire (encore) les coordonnées des carbones \alpha des 10 premiers résidus, nous pouvons utiliser le code suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
ce qui donne :
1 2 3 4 5 6 7 8 9 10 |
|
Pour extraire des valeurs numériques, comme des numéros de résidus ou des coordonnées atomiques, il ne faudra pas oublier de les convertir en entiers ou en floats.
A.4 Format XML, CSV et TSV
Les formats XML, CSV et TSV dont des formats de fichiers très largement utilisés en informatique. Ils sont tout autant très utilisés en biologie. En voici quelques exemples.
A.4.1 XML
Le format XML est un format de fichier qui permet de stocker quasiment n'importe quel type d'information de façon structurée et hiérarchisée. L'acronyme XML signifie Extensible Markup Language qui pourrait se traduire en français par « Langage de balisage extensible ». Les balises dont il est question servent à délimiter du contenu :
<balise>contenu</balise>
La balise <balise>
est une balise ouvrante.
La balise </balise>
est une balise fermante.
Notez le caractère /
qui marque la différence entre une balise ouvrante
et une balise fermante.
Il existe également des balises vides, qui sont à la fois ouvrantes et fermantes :
<balise />
Une balise peut avoir certaines propriétés, appelées attributs, qui sont définies, dans la balise ouvrante. Par exemple :
<balise propriété1=valeur1 propriété2=valeur2>contenu</balise>
Un attribut est un couple nom et valeur (par exemple propriété1
est un nom
et valeur1
est la valeur associée).
Enfin, les balises peuvent être imbriquées les unes dans les autres :
1 2 3 4 5 |
|
Dans cet exemple, nous avons trois balises element
qui sont contenues dans une balise
protein
.
Voici un autre exemple avec l'enzyme trypsine humaine (code P07477) telle qu'on peut la trouver décrite dans la base de données UniProt :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
La ligne 1 indique que nous avons bien un fichier au format XML.
La ligne 3 indique que nous avons une entrée UniProt. Il s'afit d'une balise
ouvrante avec plusieurs attributs (dataset="Swiss-Prot"
, created="1988-04-01"
...).
Les lignes 4-6 précisent les numéros d'accession dans la base de données UniProt qui font référence à cette même protéine.
Les lignes 8-13 listent les quatre gènes correspondants à cette protéine.
Le premier gène porte l'attribut type="primary"
et indique qu'il s'agit
du nom officiel du gène de la trypsine.
L'attribut type="synonym"
pour les autres gènes indique qu'il s'agit bien de
noms synonymes pour le gène PRSS1
.
Les lignes 15-21 contiennent la séquence de la trypsine. Dans les attributs de
la balise <sequence>
, on retrouve, par exemple, la taille de la protéine
(length="247"
).
Voici un exemple de code Python pour manipuler le fichier XML de la trypsine humaine :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Ligne 1. On utilise le sous-module etree
du module lxml pour lire le fichier XML.
Ligne 2. On utilise le module d'expressions régulières re pour supprimer
tous les attributs de la balise uniprot
(ligne 7).
Nous ne rentrerons pas dans les détails, mais ces attributs rendent
plus complexe la lecture du fichier XML.
Ligne 9. La variable root
contient le fichier XML prêt à être manipulé.
Ligne 11. On recherche les noms des gènes (balises <name></name>
) associés
à la trypsine. Pour cela, on utilise la méthode .xpath()
avec comme argument
l'enchaînement des différentes balises qui conduisent aux noms des gènes.
Ligne 12. Pour chaque nom de gène, on va afficher son contenu (gene.text
)
et la valeur associée à l'attribut type
avec la méthode .get("type")
.
Ligne 11. On stocke dans la variable sequence
la balise associée
à la séquence de la protéine. Comme root.xpath("/uniprot/entry/sequence")
renvoie un itérateur et qu'il n'y a qu'une seule balise séquence, on
prend ici le seul et unique élément root.xpath("/uniprot/entry/sequence")[0]
.
Ligne 15. On affiche le contenu de la séquence sequence.text
, nettoyé
d'éventuels retours chariots ou espaces sequence.text.strip()
.
Ligne 16. On affiche la taille de la séquence en récupérant la valeur
de l'attribut length
(toujours de la balise <sequence></sequence>
).
Le résultat obtenu est le suivant :
1 2 3 4 5 6 7 8 9 10 |
|
A.4.2 CSV et TSV
Définition des formats
L'acronyme CSV signifie « Comma-Separated values » qu'on peut traduire littéralement par « valeurs séparées par des virgules ». De façon similaire, TSV signifie « Tabulation-Separated Values », soit des « valeurs séparées par des tabulations ».
Ces deux formats sont utiles pour stocker des données structurées sous forme de tableau, comme vous pourriez l'avoir dans un tableur.
À titre d'exemple, le tableau ci-dessous liste les structures associées à la transferrine, protéine présente dans le plasma sanguin et impliquée dans la régulation du fer. Ces données proviennent de la Protein Data Bank (PDB). Pour chaque protéine (PDB ID), est indiqué le nom de l'organisme associé (Source), la date à laquelle cette structure a été déposée dans la PDB (Deposit Date), le nombre d'acides aminés de la protéine et sa masse moléculaire (MW).
PDB ID | Source | Deposit Date | Length | MW |
---|---|---|---|---|
1A8E | Homo sapiens | 1998-03-24 | 329 | 36408.40 |
1A8F | Homo sapiens | 1998-03-25 | 329 | 36408.40 |
1AIV | Gallus gallus | 1997-04-28 | 686 | 75929.00 |
1AOV | Anas platyrhynchos | 1996-12-11 | 686 | 75731.80 |
1B3E | Homo sapiens | 1998-12-09 | 330 | 36505.50 |
1D3K | Homo sapiens | 1999-09-29 | 329 | 36407.40 |
1D4N | Homo sapiens | 1999-10-04 | 329 | 36399.40 |
1DOT | Anas platyrhynchos | 1995-08-03 | 686 | 75731.80 |
[...] | [...] | [...] | [...] | [...] |
Voici maintenant l'équivalent en CSV :
1 2 3 4 5 6 7 8 9 10 |
|
Sur chaque ligne, les différentes valeurs sont séparées par une virgule. La première ligne contient le nom des colonnes et est appelée ligne d'en-tête.
L'équivalent en TSV est :
1 2 3 4 5 6 7 8 9 10 |
|
Sur chaque ligne, les différentes valeurs sont séparées par une tabulation.
Le caractère tabulation est un caractère invisible « élastique », c'est-à-dire qu'il a une largeur variable suivant l'éditeur de texte utilisé. Par exemple, dans la ligne d'en-tête, l'espace entre PDB ID et Source apparaît comme différent de l'espace entre Deposit Date et Length alors qu'il y a pourtant une seule tabulation à chaque fois.
Lecture
En Python, le module csv de la bibliothèque standard est très pratique pour lire et écrire des fichiers au format CSV et TSV. Nous vous conseillons de lire la documentation très complète sur ce module.
Voici un exemple :
1 2 3 4 5 6 |
|
Ligne 1. Chargement du module csv.
Ligne 3. Ouverture du fichier.
Ligne 4. Utilisation du module csv pour lire le fichier CSV comme un dictionnaire (fonction DictReader()
). La ligne d'en-tête est utilisée automatiquement pour définir les clés du dictionnaire.
Ligne 5. Parcours de toutes les lignes du fichiers CSV.
Ligne 6. Affichage des champs correspondants à PDB ID, Deposit Date, Length.
Le résultat obtenu est :
1 2 3 4 5 6 7 |
|
Il suffit de modifier légèrement le script précédent pour lire un fichier TSV :
1 2 3 4 5 6 |
|
Ligne 3. Modification du nom du fichier lu.
Ligne 4. Utilisation de l'argument delimiter="\t"
qui indique
que les champs sont séparés par des tabulations.
Le résultat obtenu est strictement identique au précédent.
Écriture
Voici un exemple d'écriture de fichier CSV :
1 2 3 4 5 6 7 8 9 |
|
Ligne 3. Ouverture du fichier test.csv
en lecture.
Ligne 4. Définition du nom des colonnes (Name et Quantity).
Ligne 5. Utilisation du module csv pour écrire un fichier CSV à partir d'un dictionnaire.
Ligne 6. Écriture des noms des colonnes.
Ligne 7-9. Écriture de trois lignes. Pour chaque ligne, un dictionnaire dont les clefs sont les noms des colonnes est fourni comme argument à la méthode .writerow()
.
Le contenu du fichier test.csv
est alors :
1 2 3 4 |
|
De façon très similaire, l'écriture d'un fichier TSV est réalisée avec le code suivant :
1 2 3 4 5 6 7 8 9 |
|
Ligne 3. Modification du nom du fichier en écriture.
Ligne 5. Utilisation de l'argument delimiter="\t"
qui indique que les champs sont séparés par des tabulations.
Le contenu du fichier test.tsv
est :
1 2 3 4 |
|
Vous êtes désormais capables de lire et écrire des fichiers aux formats CSV et TSV. Les codes que nous vous avons proposés ne sont que des exemples. À vous de poursuivre l'exploration du module csv.
Le module pandas décrit dans le chapitre 17 Quelques modules d'intérêt en bioinformatique est tout à fait capable de lire et écrire des fichiers CSV et TSV. Nous vous conseillons de l'utiliser si vous analysez des données avec ces types de fichiers.