[...]

<table><tr><td>ATOM</td><td>601</td><td>N</td><td>LEU A</td><td>99</td><td>10.007</td><td>19.687</td><td>17.536</td><td>1.00</td><td>12.25</td><td>N</td></tr><tr><td>ATOM</td><td>602</td><td>CA</td><td>LEU A</td><td>99</td><td>9.599</td><td>18.429</td><td>18.188</td><td>1.00</td><td>12.25</td><td>C</td></tr><tr><td>ATOM</td><td>603</td><td>C</td><td>LEU A</td><td>99</td><td>10.565</td><td>17.281</td><td>17.914</td><td>1.00</td><td>12.25</td><td>C</td></tr><tr><td>ATOM</td><td>604</td><td>O</td><td>LEU A</td><td>99</td><td>10.256</td><td>16.101</td><td>18.215</td><td>1.00</td><td>12.25</td><td>O</td></tr><tr><td>ATOM</td><td>605</td><td>CB</td><td>LEU A</td><td>99</td><td>8.149</td><td>18.040</td><td>17.853</td><td>1.00</td><td>12.25</td><td>C</td></tr><tr><td>ATOM</td><td>606</td><td>CG</td><td>LEU A</td><td>99</td><td>7.125</td><td>19.029</td><td>18.438</td><td>1.00</td><td>18.18</td><td>C</td></tr><tr><td>ATOM</td><td>607</td><td>CD1</td><td>LEU A</td><td>99</td><td>5.695</td><td>18.554</td><td>18.168</td><td>1.00</td><td>18.18</td><td>C</td></tr><tr><td>ATOM</td><td>608</td><td>CD2</td><td>LEU A</td><td>99</td><td>7.323</td><td>19.236</td><td>19.952</td><td>1.00</td><td>18.18</td><td>C</td></tr></table>

[...]

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 (ou HETATM).

* 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 A.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ée x de l'atome.

* 19.687 : la coordonnée y de l'atome.

* 17.536 : la coordonnée 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 12.

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 :

[...]

<table><tr><td>ATOM</td><td>1</td><td>N</td><td>ILE A</td><td>16</td><td>-8.155</td><td>9.648</td><td>20.365</td><td>1.00</td><td>10.68</td><td>N</td></tr><tr><td>ATOM</td><td>2</td><td>CA</td><td>ILE A</td><td>16</td><td>-8.150</td><td>8.766</td><td>19.179</td><td>1.00</td><td>10.68</td><td>C</td></tr><tr><td>ATOM</td><td>3</td><td>C</td><td>ILE A</td><td>16</td><td>-9.405</td><td>9.018</td><td>18.348</td><td>1.00</td><td>10.68</td><td>C</td></tr><tr><td>ATOM</td><td>4</td><td>O</td><td>ILE A</td><td>16</td><td>-10.533</td><td>8.888</td><td>18.870</td><td>1.00</td><td>10.68</td><td>O</td></tr><tr><td>ATOM</td><td>5</td><td>CB</td><td>ILE A</td><td>16</td><td>-8.091</td><td>7.261</td><td>19.602</td><td>1.00</td><td>10.68</td><td>C</td></tr><tr><td>ATOM</td><td>6</td><td>CG1</td><td>ILE A</td><td>16</td><td>-6.898</td><td>6.882</td><td>20.508</td><td>1.00</td><td>7.42</td><td>C</td></tr><tr><td>ATOM</td><td>7</td><td>CG2</td><td>ILE A</td><td>16</td><td>-8.178</td><td>6.281</td><td>18.408</td><td>1.00</td><td>7.42</td><td>C</td></tr><tr><td>ATOM</td><td>8</td><td>CD1</td><td>ILE A</td><td>16</td><td>-5.555</td><td>6.893</td><td>19.773</td><td>1.00</td><td>7.42</td><td>C</td></tr><tr><td>ATOM</td><td>9</td><td>N</td><td>VAL A</td><td>17</td><td>-9.224</td><td>9.305</td><td>17.090</td><td>1.00</td><td>9.63</td><td>N</td></tr><tr><td>ATOM</td><td>10</td><td>CA</td><td>VAL A</td><td>17</td><td>-10.351</td><td>9.448</td><td>16.157</td><td>1.00</td><td>9.63</td><td>C</td></tr><tr><td>ATOM</td><td>11</td><td>C</td><td>VAL A</td><td>17</td><td>-10.500</td><td>8.184</td><td>15.315</td><td>1.00</td><td>9.63</td><td>C</td></tr><tr><td>ATOM</td><td>12</td><td>O</td><td>VAL A</td><td>17</td><td>-9.496</td><td>7.688</td><td>14.748</td><td>1.00</td><td>9.63</td><td>O</td></tr><tr><td>ATOM</td><td>13</td><td>CB</td><td>VAL A</td><td>17</td><td>-10.123</td><td>10.665</td><td>15.222</td><td>1.00</td><td>9.63</td><td>C</td></tr><tr><td>ATOM</td><td>14</td><td>CG1</td><td>VAL A</td><td>17</td><td>-11.319</td><td>10.915</td><td>14.278</td><td>1.00</td><td>11.95</td><td>C</td></tr><tr><td>ATOM</td><td>15</td><td>CG2</td><td>VAL A</td><td>17</td><td>-9.737</td><td>11.970</td><td>15.970</td><td>1.00</td><td>11.95</td><td>C</td></tr></table>

[...]

Vous remarquerez 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

<footnote n="12">12. http://www.wwpdb.org/documentation/file-format-content/format33/sect9.html</footnote>
<figure><img src="image_70.png" /><figcaption>FIGURE A.1 – Structure tridimensionnelle d'un résidu leucine. Les noms des atomes sont indiqués en noir.</figcaption></figure>

(code PDB 5X9X<fnref n="13" />) :

<table><thead><tr><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th></tr></thead><tbody><tr><td>[...]</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>ATOM</td><td>762</td><td>HB1</td><td>ALA</td><td>A</td><td>44</td><td>37.162</td><td>-2.955</td><td>2.220</td><td>1.00</td><td>0.00</td><td>H</td></tr><tr><td>ATOM</td><td>763</td><td>HB2</td><td>ALA</td><td>A</td><td>44</td><td>38.306</td><td>-2.353</td><td>3.417</td><td>1.00</td><td>0.00</td><td>H</td></tr><tr><td>ATOM</td><td>764</td><td>HB3</td><td>ALA</td><td>A</td><td>44</td><td>38.243</td><td>-1.621</td><td>1.814</td><td>1.00</td><td>0.00</td><td>H</td></tr><tr><td>TER</td><td>765</td><td></td><td>ALA</td><td>A</td><td>44</td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>ATOM</td><td>766</td><td>N</td><td>GLY</td><td>B</td><td>95</td><td>-18.564</td><td>3.009</td><td>13.772</td><td>1.00</td><td>0.00</td><td>N</td></tr><tr><td>ATOM</td><td>767</td><td>CA</td><td>GLY</td><td>B</td><td>95</td><td>-19.166</td><td>3.646</td><td>12.621</td><td>1.00</td><td>0.00</td><td>C</td></tr><tr><td>ATOM</td><td>768</td><td>C</td><td>GLY</td><td>B</td><td>95</td><td>-20.207</td><td>2.755</td><td>11.976</td><td>1.00</td><td>0.00</td><td>C</td></tr><tr><td>[...]</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr></tbody></table>

La première chaîne est notée A et la seconde B. La séparation entre les deux chaînes est marquée par la ligne :

<table><tr><td>TER</td><td>765</td><td>ALA</td><td>A</td><td>44</td></tr></table>

Dans un fichier PDB, chaque structure porte un nom de chaîne différent (par exemple : A, B, C', etc.).

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 :

<footnote n="13">13. http://www.rcsb.org/structure/5X9X</footnote>
<table><tbody><tr><td>[...]</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>MODEL</td><td>1</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>ATOM</td><td>1</td><td>N</td><td>MET</td><td>A</td><td>1</td><td>-27.283</td><td>-9.772</td><td>5.388</td><td>1.00</td><td>0.00</td><td>N</td></tr><tr><td>ATOM</td><td>2</td><td>CA</td><td>MET</td><td>A</td><td>1</td><td>-28.233</td><td>-8.680</td><td>5.682</td><td>1.00</td><td>0.00</td><td>C</td></tr><tr><td>[...]</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>ATOM</td><td>1499</td><td>HG2</td><td>GLU</td><td>B</td><td>139</td><td>36.113</td><td>-5.242</td><td>2.536</td><td>1.00</td><td>0.00</td><td>H</td></tr><tr><td>ATOM</td><td>1500</td><td>HG3</td><td>GLU</td><td>B</td><td>139</td><td>37.475</td><td>-4.132</td><td>2.428</td><td>1.00</td><td>0.00</td><td>H</td></tr><tr><td>TER</td><td>1501</td><td></td><td>GLU</td><td>B</td><td>139</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>ENDMDL</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>MODEL</td><td>2</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>ATOM</td><td>1</td><td>N</td><td>MET</td><td>A</td><td>1</td><td>-29.736</td><td>-10.759</td><td>4.394</td><td>1.00</td><td>0.00</td><td>N</td></tr><tr><td>ATOM</td><td>2</td><td>CA</td><td>MET</td><td>A</td><td>1</td><td>-28.372</td><td>-10.225</td><td>4.603</td><td>1.00</td><td>0.00</td><td>C</td></tr><tr><td>[...]</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>ATOM</td><td>1499</td><td>HG2</td><td>GLU</td><td>B</td><td>139</td><td>36.113</td><td>-5.242</td><td>2.536</td><td>1.00</td><td>0.00</td><td>H</td></tr><tr><td>ATOM</td><td>1500</td><td>HG3</td><td>GLU</td><td>B</td><td>139</td><td>37.475</td><td>-4.132</td><td>2.428</td><td>1.00</td><td>0.00</td><td>H</td></tr><tr><td>TER</td><td>1501</td><td></td><td>GLU</td><td>B</td><td>139</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>ENDMDL</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>MODEL</td><td>2</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td>ATOM</td><td>1</td><td>N</td><td>MET</td><td>A</td><td>1</td><td>-29.736</td><td>-10.759</td><td>4.394</td><td>1.00</td><td>0.00</td><td>N</td></tr><tr><td>ATOM</td><td>2</td><td>CA</td><td>MET</td><td>A</td><td>1</td><td>-28.372</td><td>-10.225</td><td>4.603</td><td>1.00</td><td>0.00</td><td>C</td></tr><tr><td>[...]</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr></tbody></table>

Chaque structure est encadrée par les lignes :

MODEL n

et :

ENDMDL

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.

Voici comment charger la structure de la trypsine bovine :

1. `from Bio.PDB import PDBParser`

2. `parser = PDBParser()`

3. `prot_id = "2PTN"`

4. `prot_file = "2PTN.pdb"`

5. `structure = parser.get_structure(prot_id, prot_file)`

#### Remarque

Les fichiers PDB sont parfois (très) mal formatés. Si `Biopython` ne parvient pas à lire un tel fichier, remplacez alors la ligne 2 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. `print(structure header["head"])`

2. `print(structure header["structure_method"])`

ce qui produit :

1. `hydrolase (serine proteinase)`

2. `x-ray diffraction`

Extraction des coordonnées de l'atome N du résidu Ile16 et de l'atome CA du résidu Val17 :
1 model = structure[0]
2 chain = model["A"]
3 res1 = chain[16]
4 res2 = chain[17]
5 print(res1.resname, res1["N").coord)
6 print(res2.resname, res2["CA").coord)

ce qui produit :

1 ILE [ -8.15499973 9.64799976 20.36499977]
2 VAL [-10.35099983 9.44799995 16.15699959]

L'objet `res1["N").coord` est un array de NumPy (voir le chapitre 20 Module NumPy). On peut alors obtenir simplement les coordonnées x, y et z d'un atome :

1 print(res1["N").coord[0], res1["N").coord[1], res1["N").coord[2])

ce qui produit :

1 -8.155 9.648 20.365

## Remarque

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 α (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 res_start = 16
2 model = structure[0]
3 chain = model["A"]
4 for i in range(10):
5 idx = res_start + i
6 print chain[idx].resname, idx, chain[idx]["CA").coord)

avec pour résultat :

ILE 16 [ -8.14999962 8.76599979 19.17900085]
VAL 17 [-10.35099983 9.44799995 16.15699959]
GLY 18 [-12.02099991 6.63000011 14.25899982]
GLY 19 [-10.90200043 3.89899993 16.68400002]
TYR 20 [-12.65100002 1.44200003 19.01600075]
THR 21 [-13.01799965 0.93800002 22.76000023]
CYS 22 [-10.02000046 -1.16299999 23.76000023]
GLY 23 [-11.68299961 -2.86500001 26.7140007]
ALA 24 [-10.64799976 -2.62700009 30.36100006]
ASN 25 [ -6.96999979 -3.43700004 31.02000046]

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 A.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 trypine bovine (2PTN.pdb) et extraire (encore) les coordonnées des carbones α des 10 premiers résidus, nous pouvons utiliser le code suivant :
```python
1 with open("2PTN.pdb", "r") as pdb_file:
2    res_count = 0
3    for line in pdb_file:
4        if line startwith("ATOM"):
5            atom_name = line[12:16].strip()
6            res_name = line[17:20].strip()
7            res_num = int(line[22:26])
8        if atom_name == "CA":
9            res_count += 1
10        x = float(line[30:38])
11        y = float(line[38:46])
12        z = float(line[46:54])
13        print(res_name, res_num, x, y, z)
14    if res_count >= 10:
15        break
```

ce qui donne :

```
ILE 16 -8.15 8.766 19.179
VAL 17 -10.351 9.448 16.157
GLY 18 -12.021 6.63 14.259
GLY 19 -10.902 3.899 16.684
TYR 20 -12.651 1.442 19.016
THR 21 -13.018 0.938 22.76
CYS 22 -10.02 -1.163 23.76
GLY 23 -11.683 -2.865 26.714
ALA 24 -10.648 -2.627 30.361
ASN 25 -6.97 -3.437 31.02
```

## Remarque

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 également très utilisés en biologie. En voici quelques exemples :

## A.4.1 XML

Le format XML est un format de fichier à balises 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<fnref n="14" /> ». 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 :

<footnote n="14">14. https://fr.wikipedia.org/wiki/Extensible_Markup_Language</footnote>
* **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 14.** 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 :

```
gene : PRSS1 (primary)
gene : TRP1 (synonym)
gene : TRY1 (synonym)
gene : TRYP1 (synonym)
sequence: MNPLLILTFVAAALAAPFDDDDKIVGGYNCEENSPVYQVSLNSGYHFCGGSLINEQWVVS
AGHCYKSKRIQVRLEHGNIEVLEGNEQFINAAKIIRHPQYDRKTLNNDIMLIKLSRAVIN
ARVSTISLPTAPPATGTKCLISGWGNTASSGADYPDELQCLDAPVLSQAKCEASYPGKIT
SNMFCVGFLEGGKDSCQGDSGGPVVCNGQLQGVVSWGDGCAQKNKPGVYTKVYNYVKWIK
NTIAANS
length: 247
```

## A.4.2 CSV et TSV

### A.4.2.1 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).

<table><thead><tr><th>PDB ID</th><th>Source</th><th>Deposit Date</th><th>Length</th><th>MW</th></tr></thead><tbody><tr><td>1A8E</td><td>Homo sapiens</td><td>1998-03-24</td><td>329</td><td>36408.40</td></tr><tr><td>1A8F</td><td>Homo sapiens</td><td>1998-03-25</td><td>329</td><td>36408.40</td></tr><tr><td>1AIV</td><td>Gallus gallus</td><td>1997-04-28</td><td>686</td><td>75929.00</td></tr><tr><td>1AOV</td><td>Anas platyrhynchos</td><td>1996-12-11</td><td>686</td><td>75731.80</td></tr><tr><td>[...]</td><td>[...]</td><td>[...]</td><td>[...]</td><td>[...]</td></tr></tbody></table>

Voici maintenant l'équivalent en CSV<fnref n="17" />:

<footnote n="17">17. https://python.sdv.u-paris.fr/data-files/transferrin_report.csv</footnote>
```
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
[...]
```

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<sup>18</sup> est :

```
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
[...]
```

Sur chaque ligne, les différentes valeurs sont séparées par une tabulation.

### Attention

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.

### A.4.2.2 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<sup>19</sup>.

Voici un exemple :

```python
1 import csv
2
3 with open("transferrin_report.csv") as f_in:
4 f_reader = csv DictReader(f_in)
5 for row in f_reader:
6 print(row["PDB ID"], row["Deposit Date"], row["Length"])
```

* 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 fichier CSV.

* Ligne 6. Affichage des champs correspondants à `PDB ID`, `Deposit Date`, `Length`.

Le résultat obtenu est :

```
1A8E 1998-03-24 329
1A8F 1998-03-25 329
1AIV 1997-04-28 686
1AOV 1996-12-11 686
[...]
```

Il suffit de modifier légèrement le script précédent pour lire un fichier TSV :

<footnote n="18">18. https://python.sdv.u-paris.fr/data-files/transferrin_report.csv</footnote>

<footnote n="19">19. https://docs.python.org/fr/3.7/library/csv.html</footnote>
```python
1 import csv
2
3 with open("transferrin_PDB_report.tsv") as f_in:
4     f_reader = csv DictReader(f_in, delimiter = "\t")
5     for row in f_reader:
6         print(row["PDB ID"], row["Deposit Date"], row["Length"])
```

* 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.

### A.4.2.3 Écriture

Voici un exemple d'écriture de fichier CSV :

```python
1 import csv
2
3 with open("test.csv", "w") as f_out:
4     fields = ["Name", "Quantity"]
5     f_writer = csv DictWriter(f_out, fieldnames = fields)
6     f_writer.writeheader()
7     f_writer writerow({"Name": "girafe", "Quantity": 5})
8     f_writer writerow({"Name": "tigre", "Quantity": 3})
9     f_writer writerow({"Name": "singe", "Quantity": 8})
```

* 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 :

```
Name,Quantity
girafe,5
tigre,3
singe,8
```

De façon très similaire, l'écriture d'un fichier TSV est réalisée avec le code suivant :

```python
1 import csv
2
3 with open("test.tsv", "w") as f_out:
4     fields = ["Name", "Quantity"]
5     f_writer = csv DictWriter(f_out, fieldnames = fields, delimiter = "\t")
6     f_writer.writeheader()
7     f_writer writerow({"Name": "girafe", "Quantity": 5})
8     f_writer writerow({"Name": "tigre", "Quantity": 3})
9     f_writer writerow({"Name": "singe", "Quantity": 8})
```

* 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 :

```
Name Quantity
girafe 5
tigre 3
singe 8
```

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.

**Remarque**
Le module `pandas` décrit dans le chapitre 22 *Module Pandas* 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.
PDB file format 3.3

<figure><img src="image_71.png" /><figcaption>FIGURE A.2 – Format PDB et les différents champs de coordonnées.</figcaption></figure>

<table><thead><tr><th>field</th><th>definition</th><th>length</th><th>format</th><th>range</th><th>Python extraction</th></tr></thead><tbody><tr><td>1</td><td>'ATOM' 'or 'HETATM'</td><td>6</td><td>{:6}</td><td>01-06</td><td>[0:6]</td></tr><tr><td>2</td><td>atom serial number</td><td>5</td><td>{:5d}</td><td>07-11</td><td>[6:11]</td></tr><tr><td>3</td><td>atom name</td><td>1</td><td>{:^4s}</td><td>13-16</td><td>[12:16]</td></tr><tr><td>4</td><td>alternate location indicator</td><td>1</td><td>{:1s}</td><td>17</td><td>[16:17]</td></tr><tr><td>5</td><td>residue name</td><td>3</td><td>{:3s}</td><td>18-20</td><td>[17:20]</td></tr><tr><td>6</td><td>chain identifier</td><td>1</td><td>{:1s}</td><td>22</td><td>[21:22]</td></tr><tr><td>7</td><td>residue sequence number</td><td>4</td><td>{:4d}</td><td>23-26</td><td>[22:26]</td></tr><tr><td>8</td><td>code for insertion of residues</td><td>1</td><td>{:1s}</td><td>27</td><td>[26:27]</td></tr><tr><td>9</td><td>orthogonal coordinates for X in Angstrom</td><td>3</td><td>{:8.3f}</td><td>31-38</td><td>[30:38]</td></tr><tr><td>10</td><td>orthogonal coordinates for Y in Angstrom</td><td>8</td><td>{:8.3f}</td><td>39-46</td><td>[38:46]</td></tr><tr><td>11</td><td>orthogonal coordinates for Z in Angstrom</td><td>8</td><td>{:8.3f}</td><td>47-54</td><td>[46:54]</td></tr><tr><td>12</td><td>occupancy</td><td>6</td><td>{:6.2f}</td><td>55-60</td><td>[54:60]</td></tr><tr><td>13</td><td>temperature factor</td><td>6</td><td>{:6.2f}</td><td>61-66</td><td>[60:66]</td></tr><tr><td>14</td><td>element symbol</td><td>10</td><td>{:=2s}</td><td>77-78</td><td>[76:78]</td></tr><tr><td>15</td><td>charge on the atom</td><td>2</td><td>{:=2s}</td><td>79-80</td><td>[78:80]</td></tr></tbody></table>

Python formatted string (old): '%-6s%5d %4s%1s%3s %1s%4d%1s %8.3f%8.3f%8.3f%6.2f%6.2f %2s%2s'

Python formatted string (Python 2.7 and Python 3.x): '{:6s}(:5d) {^4s}(:1s) (:3s) {1s} {4d} {1s} {:8.3f}(:8.3f) (:8.3f) (:6.2f) {:6.2f} {:=2s} {:=2s}'

PDB File Format: Contents Guide Version 3.30 (Nov. 21, 2012)

reference taken from http://www.wwpdb.org/documentation/file-format-content/format33/sect9.html#ATOM

<figure><img src="image_72.png" /></figure>
# Installation de Python

## Attention

La procédure d'installation ci-dessous a été testée avec la version Miniconda Latest - Conda 24.5.0 Python 3.12.4 released Jun 26, 2024.

Python est déjà présent sous Linux ou Mac OS X et s'installe très facilement sous Windows. Toutefois, nous décrivons dans cet ouvrage l'utilisation de modules supplémentaires qui sont très utiles en bioinformatique (NumPy, scipy, matplotlib, pandas, Biopython), mais également les notebooks Jupyter.

On va donc utiliser un gestionnaire de paquets qui va installer ces modules supplémentaires. On souhaite également que ce gestionnaire de paquets soit disponible pour Windows, Mac OS X et Linux. Fin 2018, il y a deux grandes alternatives :

1. **Anaconda et Miniconda** : Anaconda<fnref n="1" /> est une distribution complète de Python qui contient un gestionnaire de paquets très puissant nommé conda. Anaconda installe de très nombreux paquets et outils mais nécessite un espace disque de plusieurs gigaoctets. Miniconda<fnref n="2" /> est une version allégée d'Anaconda, donc plus rapide à installer et occupant peu d'espace sur le disque dur. Le gestionnaire de paquet conda est aussi présent dans Miniconda.

2. **Pip** : pip<fnref n="3" /> est le gestionnaire de paquets de Python et qui est systématiquement présent depuis la version 3.4.

## B.1 Que recommande-t-on pour l'installation de Python ?

Quel que soit le système d'exploitation, nous recommandons l'utilisation de Miniconda dont la procédure d'installation est détaillée ci-dessous pour Windows, Mac OS X et Linux. Le gestionnaire de paquets conda est très efficace. Il gère la version de Python et les paquets compatibles avec cette dernière de manière optimale.

Par ailleurs, nous vous recommandons vivement la lecture de la rubrique sur les éditeurs de texte. Il est en effet fondamental d'utiliser un éditeur robuste et de savoir le configurer pour « pythonner » efficacement.

Enfin, dans tout ce qui suit, nous partons du principe que vous installerez Miniconda en tant **qu'utilisateur**, et non pas en tant qu'administrateur. Autrement dit, vous n'aurez pas besoin de droits spéciaux pour pouvoir installer Miniconda et les autres modules nécessaires. La procédure proposée a été testée avec succès sous Windows 10 et 11, Mac OS X, Ubuntu 22.04 et 24.04).

<footnote n="1">1. https://www.anaconda.com/</footnote>

<footnote n="2">2. https://conda.io/miniconda.html</footnote>

<footnote n="3">3. https://pip.pypa.io/en/stable/</footnote>
Depuis quelques années, Windows 10 (et 11) propose le WSL <fnref n="4" /> (Windows Subsystem for Linux). Le WSL permet de lancer un terminal Linux au sein de Windows et propose (quasiment) toutes les fonctionnalités disponibles sous un vrai système Linux. Nous ne détaillons par comment l'installer, mais vous pouvez vous référer à la page d'installation sur le site de Microsoft <fnref n="5" />. Si vous avez installé WSL sur votre ordinateur, nous vous recommandons de suivre la procédure ci-dessous comme si vous étiez sous Linux (rubrique *Installation de Python avec Miniconda pour Linux*), plutôt que d'installer la version Windows.

## B.2 Installation de Python avec Miniconda

Nous vous conseillons l'installation de la distribution Miniconda <fnref n="6" /> qui présente l'avantage d'installer Python et un puissant gestionnaire de paquets appelé conda. Dans toute la suite de cette annexe, l'indication avec le $ et un espace comme suit :

$

signifie l' invite d'un shell quel qu'il soit (PowerShell sous Windows, bash sous Mac OS X et Linux).

### B.2.1 Installation de Python avec Miniconda pour Linux

Dans un navigateur internet, ouvrez la page du site Miniconda https://conda.io/miniconda.html puis cliquez sur le lien *Miniconda3 Linux 64-bit* correspondant à Linux et Python 3.12.

Vous allez télécharger un fichier dont le nom ressemble à quelque chose du type :

```
Miniconda3-latest-Linux-x86_64.sh.
```

Dans un shell, lancez l'installation de Miniconda avec la commande :

```
$ bash Miniconda3-latest-Linux-x86_64.sh
```

Dans un premier temps, validez la lecture de la licence d'utilisation :

Welcome to Miniconda3 py312_24.5.0-0

In order to continue the installation process, please review the license agreement.

Please, press ENTER to continue

>>>

Comme demandé, appuyez sur la touche *Entrée*. Faites ensuite défiler la licence d'utilisation avec la touche *Espace*.
Tapez yes puis appuyez sur la touche *Entrée* pour valider :

Do you accept the license terms? [yes|no]

[no] >>> yes

Le programme d'installation vous propose ensuite d'installer Miniconda dans le répertoire `miniconda3` dans votre répertoire personnel. Par exemple, dans le répertoire `/home/pierre/miniconda3` si votre nom d'utilisateur est `pierre`. Validez cette proposition en appuyant sur la touche *Entrée* :

Miniconda3 will now be installed into this location:

/home/pierre/miniconda3

- Press ENTER to confirm the location

- Press CTRL-C to abort the installation

- Or specify a different location below

[/home/pierre/miniconda3] >>>

Le programme d'installation va alors installer Python et le gestionnaire de paquets conda.

Cette étape terminée, le programme d'installation vous propose d'initialiser conda pour que celui-ci soit accessible à chaque fois que vous ouvrez un shell. Nous vous conseillons d'accepter en tapant yes puis en appuyant sur la touche *Entrée*.

<footnote n="4">4. https://fr.wikipedia.org/wiki/Windows_Subsystem_for_Linux</footnote>

<footnote n="5">5. https://learn.microsoft.com/fr-fr/windows/wsl/install</footnote>

<footnote n="6">6. https://conda.io/miniconda.html</footnote>
```
Do you wish the installer to initialize Miniconda3
by running conda init? [yes|no]
[no] >>> yes
```

L'installation de Miniconda est terminée. L'espace utilisé par Miniconda sur votre disque dur est d'environ 450 Mo.

### B.2.1.1 Test de l'interpréteur Python

Ouvrez un nouveau shell. Vous devriez voir dans votre invite la chaîne (base) indiquant que l'environnement conda de base est activé. À partir de maintenant, lorsque vous taperez la commande python, c'est le Python 3 de Miniconda qui sera lancé :

```
$ python
Python 3.12.4 | packaged by Anaconda, Inc. | (main, Jun 18 2024, 15:12:24) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

Quittez Python en tapant la commande `exit()` puis appuyant sur la touche **Entrée**.

### B.2.1.2 Test du gestionnaire de paquets conda

De retour dans le shell, testez si le gestionnaire de paquets conda est fonctionnel. Tapez la commande `conda` dans le shell, vous devriez avoir la sortie suivante :

```
$ conda
usage: conda [-h] [-v] [--no-plugins] [-V] COMMAND ...

conda is a tool for managing and deploying applications, environments and packages.

options:
  -h, --help      Show this help message and exit.
  [...]
```

Si c'est bien le cas, bravo, `conda` et bien installé et vous pouvez passez à la suite (rendez-vous à la rubrique **Installation des modules supplémentaires**) !

### B.2.1.3 Désinstallation de Miniconda

Si vous souhaitez supprimer Miniconda, rien de plus simple, il suffit de suivre ces deux étapes :

**Étape 1. Supprimer le répertoire de Miniconda.** Par exemple pour l'utilisateur `pierre` :

```
$ rm -rf /home/pierre/miniconda3
```

**Étape 2.** Dans le fichier de configuration du shell Bash, supprimer les lignes comprises entre

```
# >>> conda initialize >>>
```

et

```
# <<< conda initialize <<<
```

### B.2.2 Installation de Python avec Miniconda pour Mac OS X

Dans un navigateur internet, ouvrez la page du site Miniconda https://conda.io/miniconda.html puis cliquez sur le lien *Miniconda3 macOS Intel x86 64-bit bash* correspondant à Mac OS X et Python 3.12.

Vous allez télécharger un fichier dont le nom ressemble à quelque chose du type :

```
Miniconda3-latest-MacOSX-x86_64.sh.
```

Le système d'exploitation Mac OS X étant basé sur Unix, la suite de la procédure est en tout point identique à la procédure détaillée à la rubrique précédente pour Linux.

Donc, lancez la commande :

```
$ bash Miniconda3-latest-MacOSX-x86_64.sh
```
puis suivez les mêmes instructions que dans la rubrique précédente (la seule petite subtilité est pour le chemin, choisissez `/User/votre_nom_utilisateur/miniconda3` sous Mac au lieu de `/home/votre_nom_utilisateur/miniconda3` sous Linux).

### B.2.3 Installation de Python avec Miniconda pour Windows 10 et 11

Dans cette rubrique, nous détaillons l'installation de Miniconda sous Windows.

**Attention**

Nous partons du principe qu'aucune version d'Anaconda, Miniconda, ou encore de Python « classique » (obtenue sur le site officiel de Python 7) n'est installée sur votre ordinateur. Si tel est le cas, nous vous recommandons vivement de la désinstaller pour éviter des conflits de version.

* Dans un navigateur internet, ouvrez la page du site Miniconda https://conda.io/miniconda.html puis cliquez sur le lien *Miniconda3 Windows 64-bit* correspondant à Windows et Python 3.12. Vous allez télécharger un fichier dont le nom ressemble à quelque chose du type : *Miniconda3-latest-Windows-x86_64.exe*.

* Une fois téléchargé, double-cliquez sur ce fichier, cela lancera l'installateur de Miniconda :

<figure><img src="image_73.png" /><figcaption>FIGURE B.1 – Installation Miniconda étape 1.</figcaption></figure>

* Cliquez sur *Next*, vous arrivez alors sur l'écran suivant :

* Lisez la licence et (si vous êtes d'accord) cliquez sur *I agree*. Vous aurez ensuite :

* Gardez le choix de l'installation seulement pour vous (case cochée à *Just me (recommended)*), puis cliquez sur *Next*. Vous aurez ensuite :

* L'installateur vous demande où installer Miniconda, nous vous recommandons de laisser le choix par défaut (resemblant à `C:\Users\votre_nom_utilisateur\Miniconda3`). Cliquez sur *Next*, vous arriverez sur :

* Gardez la case *Register Anaconda as my default Python 3.12* cochée et ne cochez pas la case *Add Anaconda to my PATH environment variable*. Vous pouvez garder la case *Create Shortcuts* cochée. Cliquez ensuite sur *Install*, l'installation se lance et durera quelques minutes :

* À la fin, vous obtiendrez :

* Décochez les cases *Learn more about Anaconda Cloud* et *Learn how to get started with Anaconda* et cliquez sur *Finish*. Miniconda est maintenant installé.

<footnote n="7">7. https://www.python.org/downloads/</footnote>
<figure><img src="image_74.png" /><figcaption>FIGURE B.2 – Installation Miniconda étape 2.</figcaption></figure>

<figure><img src="image_75.png" /><figcaption>FIGURE B.3 – Installation Miniconda étape 3.</figcaption></figure>

### B.2.3.1 Initialisation de conda

Il nous faut maintenant initialiser *conda*. Cette manipulation va permettre de le rendre visible dans n'importe quel shell Powershell.

L'installateur a en principe ajouté des nouveaux raccourcis dans le Menu Démarrer contenant le mot Anaconda :

* Anaconda Powershell Prompt (Miniconda3) : pour lancer un shell Powershell (shell standard de Windows équivalent du bash sous Linux) avec *conda* qui est activé correctement;

* Anaconda Prompt (Miniconda3) : même chose mais avec le shell nommé cmd ; ce vieux shell est limité et nous vous en déconseillons l'utilisation.

Nous allons maintenant initialiser *conda* « à la main ». Cliquez sur Anaconda Powershell Prompt (Miniconda3) qui va lancer un Powershell avec *conda* activé, puis tapez la commande *conda init* :

Lorsque vous presserez la touche Entrée vous obtiendrez une sortie de ce style :
<figure><img src="image_76.png" /><figcaption>FIGURE B.4 – Installation Miniconda étape 4.</figcaption></figure>

<figure><img src="image_77.png" /><figcaption>FIGURE B.5 – Installation Miniconda étape 5.</figcaption></figure>

```
$ conda init
no change   C:\Users\Pat\miniconda3\Scripts\conda.exe
no change   C:\Users\Pat\miniconda3\Scripts\conda-env.exe
no change   C:\Users\Pat\miniconda3\Scripts\conda-script.py
no change   C:\Users\Pat\miniconda3\Scripts\conda-env-script.py
no change   C:\Users\Pat\miniconda3\condabin\conda.bat
no change   C:\Users\Pat\miniconda3\Library\bin\conda.bat
no change   C:\Users\Pat\miniconda3\condabin\_conda_activation.bat
no change   C:\Users\Pat\miniconda3\condabin\rename_tmp.bat
no change   C:\Users\Pat\miniconda3\condabin\conda_auto_activation.bat
no change   C:\Users\Pat\miniconda3\condabin\conda_hook.bat
no change   C:\Users\Pat\miniconda3\Scripts\activate.bat
no change   C:\Users\Pat\miniconda3\condabin\activate.bat
no change   C:\Users\Pat\miniconda3\condabin\deactivate.bat
modified   C:\Users\Pat\miniconda3\Scripts\activate
modified   C:\Users\Pat\miniconda3\Scripts\deactivate
modified   C:\Users\Pat\miniconda3\etc\profile.d\conda.sh
modified   C:\Users\Pat\miniconda3\etc\fish\conf.d\conda.fish
no change   C:\Users\Pat\miniconda3\shell\condabin\Conda.psm1
modified   C:\Users\Pat\miniconda3\shell\condabin\conda-hook.ps1
no change   C:\Users\Pat\miniconda3\Lib\site-packages\xontrib\conda.xsh
modified   C:\Users\Pat\miniconda3\etc\profile.d\conda.csh
modified   C:\Users\Pat\Documents\WindowsPowerShell\profile.ps1
modified   HKEY_CURRENT_USER\Software\Microsoft\Command Processor\AutoRun
```

Cours de Python / Université Paris Cité / UFR Sciences du Vivant shell. <==

```
$ conda init
no change   C:\Users\Pat\miniconda3\Scripts\conda.exe
no change   C:\Users\Pat\miniconda3\Scripts\conda-env.exe
```
<figure><img src="image_78.png" /><figcaption>FIGURE B.6 – Installation Miniconda étape 6.</figcaption></figure>

<figure><img src="image_79.png" /><figcaption>FIGURE B.7 – Installation Miniconda étape 7.</figcaption></figure>

Notez que cette manipulation créera automatiquement un fichier

C:\Users\nom_utilisateur\Documents\WindowsPowerShell\profile.ps1.

Ce fichier sera exécuté à chaque lancement d'un Powershell (équivalent du .bashrc sous bash) et fera en sorte que conda soit bien activé.

### B.2.3.2 Test de l'interpréteur Python

Nous sommes maintenant prêts à tester l'interpréteur Python. En premier lieu, il faut lancer un shell PowerShell. Pour cela, cliquez sur le bouton Windows et tapez powershell. Vous devriez voir apparaître le menu suivant :

Cliquez sur l'icône Windows PowerShell, cela va lancer un shell PowerShell avec un fond bleu (couleur que l'on peut bien sûr modifier en cliquant sur la petite icône représentant un terminal dans la barre de titre). En principe, l' invite du shell doit ressembler à (base) PS C:\Users\Pat>. La partie (base) indique que conda a bien été activé suite à l'initialisation faite si dessus (plus exactement c'est son environnement de base qui est activé, mais ça ne nous importe pas pour l'instant). Pour tester si Python est bien installé, il suffit alors de lancer l'interpréteur Python en tapant la commande python :

Si tout s'est bien passé, vous devriez avoir un affichage de ce style :
<figure><img src="image_80.png" /><figcaption>FIGURE B.8 – Menu Anaconda Powershell Prompt</figcaption></figure>

<figure><img src="image_81.png" /><figcaption>FIGURE B.9 – Initialisation de conda</figcaption></figure>

<figure><img src="image_82.png" /><figcaption>FIGURE B.10 – Menu pour lancer un PowerShell.</figcaption></figure>

```
(base) PS C:\Users\Pat> python
Python 3.12.4 | packaged by Anaconda, Inc. | (main, Jun 18 2024, 15:03:56) [MSC v.1929 64 bit (AMD64)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

Cela signifie que vous êtes bien dans l'interpréteur Python. À partir de là vous pouvez taper `exit()` puis appuyer sur
<figure><img src="image_83.png" /><figcaption>FIGURE B.11 – Lancement de l'interpréteur Python dans un PowerShell.</figcaption></figure>

la touche Entrée pour sortir de l'interpréteur Python.

### B.2.3.3 Test du gestionnaire de paquets conda

Une fois revenu dans le shell, tapez la commande `conda`, vous devriez obtenir :

```
usage: conda-script.py [-h] [-v] [--no-plugins] [-V] COMMAND ...
```

`conda` is a tool for managing and deploying applications, environments and packages.

options:

- `-h`, `--help` Show this help message and exit.

- `-v`, `--verbose` Can be used multiple times. Once for detailed output, twice for INFO logging, thrice for DEBUG.

logging, four times for TRACE logging.

- `--no-plugins` Disable all plugins that are not built into `conda`.

- `-V`, `--version` Show the `conda` version number and exit.

[... ]

Si c'est le cas, bravo, `conda` est bien installé et vous pouvez passez à la suite (rendez-vous à la rubrique **Installation des modules supplémentaires**) !

### B.2.3.4 Désinstallation de Miniconda

Si vous souhaitez désinstaller Miniconda, rien de plus simple. Dans le menu Windows, tapez `Anaconda` puis **Désinstaller**. Cela vous emmènera dans le panneau de configuration. Faites alors un clic droit sur `Miniconda3 py312...`, puis cliquez sur **Désinstaller**. Cela devrait ouvrir la fenêtre suivante :

Cliquez sur **Next**. Vous aurez alors l'écran suivant :

Cliquez sur **Uninstall**, puis à l'écran suivant confirmez que vous souhaitez désintaller Miniconda :

Le désinstallateur se lancera alors (cela peut prendre quelques minutes) :

Une fois la désinstallation terminée, cliquez sur **Next** :

Puis enfin sur **Finish** :

À ce point, Miniconda est bien désinstallé. Il reste toutefois une dernière manipulation que l'installateur n'a pas effectué : il faut détruire à la main le fichier

```
C:\Users\nom_utilisateur\Documents\WindowsPowerShell\profile.ps1
```

(bien sûr, remplacez `nom_utilisateur` par votre propre nom d'utilisateur). Si vous ne le faites pas, cela affichera un message d'erreur à chaque fois que vous lancerez un Powershell.
<figure><img src="image_84.png" /><figcaption>FIGURE B.12 – Désinstallation de Miniconda (étape 1).</figcaption></figure>

<figure><img src="image_85.png" /><figcaption>FIGURE B.13 – Désinstallation de Miniconda (étape 2).</figcaption></figure>

# B.3 Utilisation de conda pour installer des modules complémentaires

## B.3.1 Installation des modules supplémentaires

Cette étape sera commune pour les trois systèmes d'exploitation. À nouveau, lancez un shell (c'est-à-dire PowerShell sous Windows ou un terminal pour Mac OS X ou Linux).

Dans le shell, tapez la ligne suivante puis appuyez sur la touche **Entrée** :

```
$ conda install numpy pandas matplotlib scipy biopython jupyterlab
```

Cette commande va lancer l'installation des modules externes NumPy, pandas, matplotlib, scipy, Biopython et Jupyter lab. Ces modules vont être téléchargés depuis internet par conda, il faut bien sûr que votre connexion internent soit fonctionnelle. Au début, conda va déterminer les versions des paquets à télécharger en fonction de la version de Python ainsi que d'autres paramètres (cela prend une à deux minutes). Cela devrait donner la sortie suivante :
<figure><img src="image_86.png" /><figcaption>FIGURE B.14 – Désinstallation de Miniconda (étape 3).</figcaption></figure>

<figure><img src="image_87.png" /><figcaption>FIGURE B.15 – Désinstallation de Miniconda (étape 4).</figcaption></figure>

Channels:
- defaults
Platform: linux-64
Collecting package metadata (repodata.json): done
Solving environment: done

## Package Plan ##

environment location: /home/fuchs/miniconda3

added / updated specs:

- biopython

- jupyterlab

- matplotlib

- numpy

- pandas

- scipy

The following packages will be downloaded:

<table><thead><tr><th>package</th><th></th><th>build</th><th></th></tr></thead><tbody><tr><td>anyio-4.2.0</td><td>py312h06a4308_0</td><td>238 KB</td><td></td></tr><tr><td>argon2-cffi-21.3.0</td><td>pyhd3eb1b0_0</td><td>15 KB</td><td></td></tr><tr><td>argon2-cffi-bindings-21.2.0</td><td>py312h5eee18b_0</td><td></td><td></td></tr><tr><td>asttokens-2.0.5</td><td>pyhd3eb1b0_0</td><td>20 KB</td><td></td></tr></tbody></table>

[...]
<figure><img src="image_88.png" /><figcaption>FIGURE B.16 – Désinstallation de Miniconda (étape 5).</figcaption></figure>

<figure><img src="image_89.png" /><figcaption>FIGURE B.17 – Désinstallation de Miniconda (étape 6).</figcaption></figure>

Une fois que les versions des paquets ont été déterminées, conda vous demande confirmation avant de démarrer le téléchargement. Tapez y puis appuyez sur la touche Entrée pour confirmer. S'en suit alors le téléchargement et l'installation de tous les paquets (cela prendra quelques minutes) :

Une fois que tout cela est terminé, vous récupérez la main dans le shell :

```
[...]
Downloading and Extracting Packages:
mkl-2023.1.0 | 171.5 MB | #
```

```
isque
% Preparing transaction: done
% Verifying transaction: done
% Executing transaction: done
$```

## B.3.2 Test des modules supplémentaires

Pour tester la bonne installation des modules, lancez l'interpréteur Python :

```
$ python
```
Puis tapez les lignes suivantes :

1 import numpy

2 import scipy

3 import Bio

4 import matplotlib

5 import pandas

Vous devriez obtenir la sortie suivante :

>>> import numpy

>>> import scipy

>>> import Bio

>>> import matplotlib

>>> import pandas

>>>

Si aucune erreur ne s'affiche et que vous récupérez la main dans l'interpréteur, bravo, ces modules sont bien installés.
Quittez l'interpréteur Python en tapant la commande `exit()` puis en appuyant sur la touche *Entrée*.

Vous êtes de nouveau dans le shell. Nous allons maintenant pouvoir tester Jupyter. Tapez dans le shell :

```
$ jupyter lab
```

Cette commande devrait ouvrir votre navigateur internet par défaut et lancer Jupyter :

<figure><img src="image_90.png" /><figcaption>FIGURE B.18 – Test de Jupyter : ouverture dans un navigateur.</figcaption></figure>

Pour quitter Jupyter, allez dans le menu File puis sélectionnez Quit. Vous pourrez alors fermer l'onglet de Jupyter.
Pendant ces manipulations dans le navigateur, de nombreuses lignes ont été affichées dans l'interpréteur :

```
(base) PS C:\Users\Pat> jupyter lab
[I 18:26:05.544 LabApp] JupyterLab extension loaded from C:\Users\Pat\Miniconda3\lib\site-packages\jupyterlab
[I 18:26:05.544 LabApp] JupyterLab application directory is C:\Users\Pat\Miniconda3\share\jupyter\lab
[...]
[I 18:27:20.645 LabApp] Interrupted...
[I 18:27:32.986 LabApp] Shutting down 0 kernels
(base) PS C:\Users\Pat>
```

Il s'agit d'un comportement normal. Quand Jupyter est actif, vous n'avez plus la main dans l'interpréteur et tous ces messages s'affichent. Une fois que vous quittez Jupyter, vous devriez récupérer la main dans l'interpréteur. Si ce n'est pas le cas, pressez deux fois la combinaison de touches `Ctrl + C`

Si tous ces tests ont bien fonctionné, bravo, vous avez installé correctement Python avec Miniconda ainsi que tous les modules qui seront utilisés pour ce cours. Vous pouvez quitter le shell en tapant `exit` puis en appuyant sur la touche *Entrée* et aller faire une pause !

### B.3.3 Un mot sur pip pour installer des modules complémentaires

#### Conseil

Si vous êtes débutant, vous pouvez sauter cette rubrique.
Comme indiqué au début de ce chapitre, pip<fnref n="8" /> est un gestionnaire de paquets pour Python et permet d'installer des modules externes. Pip est également présent dans Miniconda, donc utilisable et parfaitement fonctionnel. Vous pouvez vous poser la question « Pourquoi utiliser le gestionnaire de paquets pip si le gestionnaire de paquets conda est déjà présent ? ». La réponse est simple, certains modules ne sont présents que sur les dépôts pip. Si vous souhaitez les installer il faudra impérativement utiliser pip. Inversement, certains modules ne sont présents que dans les dépôts de conda. Toutefois, pour les modules classiques (comme NumPy, scipy, etc), tout est gérable avec conda.

**Sauf cas exceptionnel, nous vous conseillons l'utilisation de conda pour gérer l'installation de modules supplémentaires.**

Si vous souhaitez installer un paquet qui n'est pas présent sur un dépôt conda avec pip, assurez vous d'abord que votre environnement conda est bien activé (avec conda activate ou conda activate nom_environnement). La syntaxe est ensuite très simple :

```
$ pip install nom_dupaquet
```

Si votre environnement conda était bien activé lors de l'appel de cette commande, celle-ci aura installé votre paquet dans l'environnement conda. Tout est donc bien encapsulé dans l'environnement conda, et l'ajout de tous ces paquets ne risque pas d'interférer avec le Python du système d'exploitation, rendant ainsi les choses bien « propres ».

## B.4 Choisir un bon éditeur de texte

La programmation nécessite d'écrire des lignes de code en utilisant un éditeur de texte. Le choix de cet éditeur est donc fondamental, celui-ci doit nous aider à repérer rapidement certaines zones du programme afin d'être efficace. Outre les fonctions de manipulation / remplacement / recherche de texte, un bon éditeur doit absolument posséder la **coloration syntaxique** (syntax highlighting en anglais). Celle-ci change la couleur et / ou la police de certaines zones du code comme les mot-clés du langage, les zones entre guillemets, les commentaires, etc. Dans ce qui suit, nous vous montrons des éditeurs faciles à prendre en main par les débutants pour Linux, Windows et Mac OS X.

### B.4.1 Installation et réglage de gedit sous Linux

Pour Linux, on vous recommande l'utilisation de l'éditeur de texte gedit qui a les avantages d'être simple à utiliser et présent dans la plupart des distributions Linux.

Si gedit n'est pas installé, vous pouvez l'installer avec la commande :

```
$ sudo apt install -y gedit
```

Il faudra entrer votre mot de passe utilisateur puis valider en appuyant sur la touche Entrée.

Pour lancer cet éditeur, tapez la commande gedit dans un shell ou cherchez gedit dans le lanceur d'applications. Vous devriez obtenir une fenêtre similaire à celle-ci :

On configure ensuite gedit pour que l'appui sur la touche Tab corresponde à une indentation de 4 espaces, comme recommandée par la PEP 8 (chapitre 15 Bonnes pratiques en programmation Python). Pour cela, cliquez sur l'icône en forme de 3 petites barres horizontales en haut à droite de la fenêtre de gedit, puis sélectionnez Préférences. Dans la nouvelle fenêtre qui s'ouvre, sélectionnez l'onglet Éditeur puis fixez la largeur des tabulations à 4 et cochez la case Insérer des espaces au lieu des tabulations :

Si vous le souhaitez, vous pouvez également cochez la case Activer l'indentation automatique qui indentera automatiquement votre code quand vous êtes dans un bloc d'instructions. Fermez la fenêtre de paramètres une fois la configuration terminée.

### B.4.2 Installation et réglage de Notepad++ sous Windows

Sous Windows, nous vous recommandons l'excellent éditeur Notepad++<fnref n="9" />. Une fois cet éditeur installé, il est important de le régler correctement. En suivant le menu Paramètres, Préférences, vous arriverez sur un panneau vous permettant de configurer Notepad++.

En premier on va configurer l'appui sur la touche Tab afin qu'il corresponde à une indentation de 4 espaces, comme recommandé par la PEP 8 (chapitre 15 Bonnes pratiques en programmation Python). Dans la liste sur la gauche, cliquez

<footnote n="8">8. https://pip.pypa.io/en/stable/</footnote>

<footnote n="9">9. https://notepad-plus-plus.org/download</footnote>
<figure><img src="image_91.png" /><figcaption>FIGURE B.19 – Éditeur de texte *gedit*.</figcaption></figure>

<figure><img src="image_92.png" /></figure>

<figure><img src="image_93.png" /><figcaption>FIGURE B.20 – Configuration de *gedit*.</figcaption></figure>

sur Langage, puis à droite dans le carré Tabulations cochez la case Insérer des espaces en réglant sur 4 espaces comme indiqué ci-dessous :

Ensuite, il est important de faire en sorte que Notepad++ affiche les numéros de ligne sur la gauche (très pratique lorsque l'interpréteur nous indique qu'il y a une erreur, par exemple, à la ligne 47). Toujours dans la fenêtre Préférences, dans la liste sur la gauche cliquez sur Zones d'édition, puis sur la droite cochez la case Afficher la numérotation des lignes comme indiqué ici :
<figure><img src="image_94.png" /><figcaption>FIGURE B.21 – Configuration de Notepad++ : indentation avec des espaces.</figcaption></figure>

<figure><img src="image_95.png" /><figcaption>FIGURE B.22 – Configuration de Notepad++ : numéro de ligne.</figcaption></figure>

B.4.3 Installation et réglage de TextWrangler/BBedit sous Mac OS X

Sur les anciennes versions de Mac OS X (< 10.14), TextWrangler<sup>10</sup> était un éditeur de texte simple, intuitif et efficace. Toutefois son développement a été arrêté car il fonctionnait en 32-bits. Il a été remplacé par BBedit<sup>11</sup> qui possède de nombreuses fonctionnalités supplémentaires mais qui doit en principe être acheté. Toutefois, ce dernier est utilisable gratuitement avec les mêmes fonctionnalités que TextWrangler, sans les nouvelles fonctionnalités étendues. Ne possédant pas de Mac, nous nous contentons ici de vous donner quelques liens utiles :

* La page de téléchargement<sup>12</sup>;

* La page vers de nombreuses ressources<sup>13</sup> utiles;

* Le manuel d'utilisation<sup>14</sup> (avec toutes les instructions pour son installation au chapitre 2);

* Une page sur Stackoverflow<sup>15</sup> qui vous montre comment faire en sorte que l'appui sur la touche Tab affiche 4 espaces plutôt qu'une tabulation.

<footnote n="10">10. http://www.barebones.com/products/textwrangler/</footnote>

<footnote n="11">11. https://www.barebones.com/products/bbedit/</footnote>

<footnote n="12">12. http://www.barebones.com/products/bbedit/download.html</footnote>

<footnote n="13">13. https://www.barebones.com/support/bbedit/</footnote>

<footnote n="14">14. https://s3.amazonaws.com/BBSW-download/BBEdit_12.6.6_User_Manual.pdf</footnote>

<footnote n="15">15. https:// stackoverflow.com/questions/5750361/auto-convert-tab-to-4-spaces-in-textwrangler</footnote>
### B.4.4 Pour aller plus loin

Jusque là, nous vous avons montré des éditeurs de texte simples qui sont, selon nous, idéaux pour apprendre un langage de programmation. Ainsi, on se concentre sur le langage Python plutôt que toutes les options de l'éditeur. Toutefois, pour les utilisateurs plus avancés, nous vous conseillons des plateformes de développement 16 ou IDE (*integrated development environment*) qui, au-delà de l'édition, permettent par exemple d'exécuter le code et de le debugger (c'est-à-dire, y chasser les erreurs). On peut citer par exemple les IDE libres Visual Studio code 17 et Spyder 18.

## B.5 Comment se mettre dans le bon répertoire dans le shell

Pour apprendre Python, nous allons devoir écrire des scripts, les enregistrer dans un répertoire, puis les exécuter avec l'interpréteur Python. Il faut pour cela être capable d'ouvrir un shell et de se mettre dans le répertoire où se trouve ce script.

Notre livre n'est pas un cours d'Unix, mais il convient au moins de savoir se déplacer dans l'arborescence avant de lancer Python. Sous Linux et sous Mac il est donc fondamental de connaître les commandes Unix `cd`, `pwd`, `ls` et la signification de `..` (point point).

Sous Linux, il existe une astuce très pratique. Si vous utilisez l'explorateur de fichiers Nautilus, quand vous êtes dans un répertoire, faites un clic droit et choisissez dans le menu *Ouvrir dans un terminal*. Vous vous retrouverez automatiquement dans le bon répertoire (vous pouvez vous en assurer avec la commande Unix `pwd`).

<figure><img src="image_96.png" /><figcaption>FIGURE B.23 – Lancement d'un terminal depuis un répertoire donné avec Nautilus).</figcaption></figure>

De façon similaire sous Windows, il existe deux astuces très pratiques. Lorsqu'on utilise l'explorateur Windows et que l'on est dans un répertoire donné :

<figure><img src="image_97.png" /><figcaption>FIGURE B.24 – Lancement d'un *powershell* depuis un répertoire donné (étape 1).</figcaption></figure>

<footnote n="16">16. https://fr.wikipedia.org/wiki/Environnement_de_d%C3%A9veloppement</footnote>

<footnote n="17">17. https://code visualstudio.com/</footnote>

<footnote n="18">18. https://www.spyder-ide.org/</footnote>
Il est possible d'ouvrir un PowerShell directement dans ce répertoire :

## Première astuce

Il suffit de taper `powershell` dans la barre qui indique le chemin :

<figure><img src="image_98.png" /><figcaption>FIGURE B.25 – Lancement d'un powershell depuis un répertoire donné (étape 2).</figcaption></figure>

puis on appuie sur entrée et le PowerShell se lance en étant directement dans le bon répertoire !

## Deuxième astuce

En pressant la touche Shift et en faisant un clic droit dans un endroit de l'explorateur qui ne contient pas de fichier (attention, ne pas faire de clic droit sur un fichier !). Vous verrez alors s'afficher le menu contextuel suivant :

Cliquez sur *Ouvrir la fenêtre PowerShell ici*, à nouveau votre Powershell sera directement dans le bon répertoire !

## Vérification

La figure suivante montre le PowerShell, ouvert de la première ou la deuxième façon, dans lequel nous avons lancé la commande `ls` qui affiche le nom du répertoire courant (celui dans lequel on se trouve, dans notre exemple `D:\PAT\Python`) ainsi que les fichiers s'y trouvant (ici il n'y a qu'un fichier : `test.py`). Ensuite nous avons lancé l'exécution de ce fichier `test.py` en tapant `python test.py`.

## À votre tour !

Pour tester si vous avez bien compris, ouvrez votre éditeur favori, tapez les lignes suivantes puis enregistrez ce fichier avec le nom `test.py` dans le répertoire de votre choix.

```python
1 import tkinter as tk
2
3 racine = tk.Tk()
4 label = tk.Label(racine, text="J'adore Python !")
5 bouton = tk Button(racine, text="Quitter", command=racine.quit)
6 bouton["fg"] = "red"
7 label.pack()
8 bouton.pack()
9 racine mainloop()
10 print("C'est fini !")
```

Comme nous vous l'avons montré ci-dessus, ouvrez un shell et déplacez-vous dans le répertoire où se trouve `test.py`. Lancez le script avec l'interpréteur Python :

```
$ python test.py
```

Si vous avez fait les choses correctement, cela devrait afficher une petite fenêtre avec un message « J'adore Python ! » et un bouton `Quitter`.

# B.6 Python web et mobile

Si vous ne pouvez ou ne souhaitez pas installer Python sur votre ordinateur (quel dommage !), des solutions alternatives s'offrent à vous.

Des sites internet vous proposent l'équivalent d'un interpréteur Python utilisable depuis votre navigateur web :

* repl.it<sup>19</sup>;

* Tutorials Point<sup>20</sup>;

<footnote n="19">19. https://repl.it/languages/python3</footnote>

<footnote n="20">20. https://www.tutorialspoint.com/execute_python3_online.php</footnote>
<figure><img src="image_99.png" /><figcaption>FIGURE B.26 – Lancement d'un *powershell* depuis un répertoire donné (étape 2bis).</figcaption></figure>

* et bien sur l'incontournable Python Tutor<fnref n="21" />.

Des applications mobiles vous permettent aussi de « pythonner » avec votre smartphone :

* Pydroid 3²² pour Android;

<footnote n="21">21. http://pythontutor.com/visualize.html#mode=edit</footnote>

<footnote n="22">22. https://play.google.com/store/apps/details?id=ru.iiec.pydroid3</footnote>
<figure><img src="image_100.png" /><figcaption>FIGURE B.27 – Lancement d'un powershell depuis un répertoire donné (étape 3).</figcaption></figure>

* Pythonista 3²³ pour iOS (payant).

Soyez néanmoins conscient que ces applications web ou mobiles peuvent être limitées, notamment sur leur capacité à installer des modules supplémentaires et à gérer les fichiers.

<footnote n="23">23. https://itunes.apple.com/us/app/pythonista-3/id1085978097</footnote>