Aller au contenu

Chapitre 5.1 - Manipulation de fichiers⚓︎

image

image

1. Lire un fichier⚓︎

Le Projet Gutenberg est une bibliothèque en ligne regroupant les versions numériques d'ouvrages libres de droits. On y a récupéré le fichier des Fables de la Fontaine au format txt.

1.1 La fonction open⚓︎

Ouvrir un fichier avec Python est simple. On utilise la fonction open présente dans la bibliothèque native.

Cette fonction prend plusieurs paramètres. Retenons les trois suivants (déroulez pour avoir des détails):

file : le nom du fichier

Le nom du fichier (avec son extension donc, au format str).

Attention, par « nom » on désigne l'adresse du fichier. Cette adresse peut-être :

  • absolue, depuis la racine du disque, C:/home/nico/Documents/donnees_en_table/fables.txt par exemple ;

  • ou relative, depuis le fichier Python qui ouvre le fichier, fables.txt par exemple si les deux fichiers sont dans le même dossier.

On conseille très fortement d'utiliser des adresses relatives.

mode : le mode d'ouverture

Le mode d'ouverture du fichier (au format str).

On peut retenir les modes suivants :

Caractère Signification
'r' ouvre en lecture, en mode texte
'w' ouvre en écriture, en effaçant le contenu du fichier
'a' ouvre en écriture, en ajoutant les données à la fin du fichier
'b' mode binaire

On notera que le mode 'w' efface directement le contenu du fichier, il n'y a pas de message d'avertissement !

encoding : l'encodage utilisé

Le type d'encodage (au format str).

L'encodage d'un fichier correspond à la façon dont le programme qui l'ouvre doit interpréter les données qu'il contient.

Un fichier est stocké en machine sous forme d'une succession de bits. Dans la table ASCII initiale, 7 bits représentent un caractère. Dans la table ASCII étendue, il faut 8 bits pour représenter un caractère. L'encodage 'utf-8' est plus subtil : les caractères « courants » (l'alphabet latin par exemple) sont codés sur 8 bits, les caractères moins « courants » sur 16 voire 24 bits.

Changer l'encodage lors de l'ouverture d'un fichier ne modifie pas les données contenues dans le fichier mais la façon de les lire.

Par exemple les bits 010100110110100101101101011100000110110001100101001000000111010001100101011110000111010001100101 lus :

  • avec l'encodage 'utf-8' donnent 'Simple texte',

  • avec l'encodage 'utf-16 LE' donnent '楓灭敬琠硥整' !

L'encodage le plus classique pour nous sera 'utf-8'.

La fonction open peut être utilisée de deux façons :

  • utilisation classique, on ouvre et on ferme le fichier :

    Python
    fichier = open(file="fichier.txt", mode="r", encoding="utf-8")
    # Traitement du fichier
    fichier.close()
    

    Techniquement, on devrait même utiliser un try ... except au cas où le fichier est inaccessible :

    Python
    try:
        fichier = open(file="fichier.txt", mode="r", encoding="utf-8")
        # Traitement du fichier
        fichier.close()
    except IOError:  # Le fichier est inaccessible
        print("Le fichier est inaccessible")
    
  • utilisation avec with, il est inutile de fermer le fichier et de gérer les erreurs, c'est automatique :

    Python
    with open(file="fichier.txt", mode="r", encoding="utf-8") as fichier:
        # Traitement du fichier
    

On utilisera la seconde méthode.

1.2 Lire le fichier, des lignes, une ligne !⚓︎

Une fois le fichier ouvert, on peut réaliser différentes actions. Si l'objet renvoyé par open s'appelle fichier, on peut :

  • fichier.read() : lit la totalité du fichier. Renvoie une unique chaîne de caractères.
  • fichier.readlines() : lit la totalité du fichier ligne par ligne. Renvoie la liste contenant les différentes lignes.
  • fichier.readline() : lit la prochaine ligne du fichier ligne par ligne. Renvoie une chaîne de caractères.
Écrire ?

Si le fichier est ouvert en mode écriture, on peut écrire en faisant fichier.write("texte à écrire").

Attention toutefois à ne pas écraser le contenu du fichier !

Les deux scripts ci-dessous sont donc équivalents :

Python
with open(file="fichier.txt", mode="r", encoding="utf-8") as fichier:
    contenu = fichier.readlines()
Python
contenu = []
with open(file="fichier.txt", mode="r", encoding="utf-8") as fichier:
    for ligne in fichier:
        contenu.append(ligne)

La seconde permet toutefois de traiter précisément chaque ligne lue. On l'utilisera préférentiellement.

1.3 Des cigales et des fourmis⚓︎

Nous sommes donc équipés pour ouvrir et lire nos fichiers.

Lire les fables de la Fontaine

Le fichier contenant les fables de la Fontaine est nommé fables.txt, il est situé dans le même dossier que le fichier Python manipulé par l'éditeur. Il est encodé en utf-8.

Compléter le script afin d'ouvrir ce fichier et charger ses différentes lignes dans une liste.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013(og)5wrh3a [;v,c8lS/ekm=4pqnib1:y-2]ut_xd.Pfs050P0v0M0k0D0s0T0l0q0s0k0T0T0y010M0D0A010406050T0L0x0x0k0h0H040t0c0s0L0.0c0C050u0^0`0|0~0?0A04051e171h0u1e0?0P0D0o0$0(0*0,0(0C0d0L0k0d0v0I0A0H0M0i150l0i0D0d0i0s1J0i0M0;050X0E0s0v1q0)0+011I1K1M1K0M1S1U1Q0M0h1f1E0$110T0A0k0C0,0J011W1s010S0Z0v0C0k0x0v1Q1=1@1|1Y1 1U22240;0a0l0R0h0c0A0c0T0D140C0l0V1:0h0h0v0q2p17270C1f0u1E2C1,1.1-1R0P291t0D0C212m1Q1n1p0%1X2M2O0C0c2S1Q0A2v1f2A2C2)0@1?2q2U1}2Y0h0{0s1Q0k1H2v0S0,030N0N0q2Z0v1M2X0c0I0f0I0F0;0F170k2*2-0=2,282/1Y2;2?2^2`0v2|012~3032342P370I1`040J3d3f1@3h2A2L013m0k2@1f2_0i2{2}2 310V3w2Y3y0j0;0j3D2z3g0?3H3k0,3K3M053O3Q3s3S3v2N3x380z0;0z3#183g1i2%172S2F0P1.2K3*013T251f431g412+3~3F054a2(2-0l0D0P0,2 2A3y3a3N4n4p013=3U3@3W383a0l2d0v4q3u4A354t1Q0u3e3i2.1r3l0;0S0k1T0v0T3$3F0l4Q3I0c0;0y4!2B4$3)4S0,0:040m0K4,3h4h2B4%4o4I4s383A3.4w4I4a3V36511{4G553?4L592C4P4/2V010w0;0g2o0i4_4.4m480C0E0;2k214_4%484=0b5z5i2:4U205E5s4:014)044+4{4l3j5L0T3A020B0L0c0M0n4V4X0T0Q0M0O0M5W5Y5!5J5S5j4=0p5q5A5L0C0;0x325:4R5j5N5P2+5F1Y5U0;5-5Z0n0h695/5Q5_5=0;5@5Q5r5;5G04213T2N0d5 4(4*6t4867046d0n130S0I0r6A6w5L4=0e5^650,5l040)6L5K5j5{041 0q1I0v0h6H6h040G4_0?6f3H4~4y0N500I3Y4v6-4z334B586;5a234H6.566`3X4N3e0l766l601}6O0S0c6!6k6g6n1$2O6R6m1Y0c0g0;2N7k794T6V0D6X0D6Z6#1}4=6(5Q6*644m6@6/2-3y3`6?4x6^577K6}245c4K3^0I7L3D777Z783I6U5$1U4Z6+6S1}5N0Q7z7t0k0A0A210P7:4;0;5D7+7l3+0;7i0v7`016J6)5z0u4k400v2C4d2D45172G8h4W1U8d1o4`0V0X0Z0T04.

On obtient la liste suivante :

Python
fables = [
    'FABLES DE LA FONTAINE\n',
    '\n',
    'I\n',
    '\n',
    'LA CIGALE ET LA FOURMI.\n',
    '\n',
    '\n',
    'La cigale, ayant chanté\n',
    "Tout l'été,\n",
    ...
]

Le '\n' que l'on observe à plusieurs reprises est le caractère de retour à la ligne. On peut le supprimer en faisant ligne.strip(). En effet, la méthode strip supprime les caractères « blancs » au début ou à la fin d'une chaîne de caractères.

La lecture du fichier devient alors :

Python
fables = []
with open(file="fables.txt", mode="r", encoding="utf-8") as fichier:
    for ligne in fichier:
        ligne_propre = ligne.strip()  # suppression des \n
        fables.append(ligne_propre)

On obtient :

Python
fables = [
    'FABLES DE LA FONTAINE',
    '',
    'I',
    '',
    'LA CIGALE ET LA FOURMI.',
    '',
    '',
    'La cigale, ayant chanté',
    "Tout l'été,",
    ...
]
Relire les fables de la Fontaine

On a supprimé les caractères de retour à la ligne mais il reste désormais des lignes vides dans la liste fables.

Compléter le script afin d'ouvrir ce fichier, charger ses différentes lignes non vides dans une liste.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013(og)5wrh3!6a [;v,c8lS/ekm=4p9qnib1:y-2]ut_xd.Pfs050S0x0P0m0G0u0W0n0s0u0m0W0W0A010P0G0C010406050W0O0z0z0m0h0K040v0c0u0O0;0c0F050w0{0}0 110_0C04051h1a1k0w1h0_0S0G0q0)0+0-0/0+0F0d0O0m0d0x0L0C0K0P0i180n0i0G0d0i0u1M0i0P0@050!0H0u0x1t0,0.011L1N1P1N0P1V1X1T0P0h1i1H0)140W0C0m0F0/0M011Z1v010V0$0x0F0m0z0x1T1^1`1 1#221X25270@0a0n0U0h0c0C0c0W0G170F0n0Y1?0h0h0x0s2s1a2a0F1i0w1H2F1/1;1:1U0S2c1w0G0F242p1T1q1s0*1!2P2R0F0c2V1T0C2y1i2D2F2,0`1_2t2X202#0h0~0u1T0m1K2y0V0/030Q0Q0s2$0x1P2!0c0L0D0L0I0@0I1a0m2-2:0^2/2b2=1#2@2_2{2}0x2 01313335372S3a0L1}040M3g3i1`3k2D2O013p0m2`1i2|0i2~3032340Y3z2#3B0j0@0j3G2C3j0_3K3n0/3N3P053R3T3v3V3y2Q3A3b0B0@0B3(1b3*3l2;1u3o0c2^3O3r3S3t3U3x3X3`3Z3b0f0@0f402,3+2:3L3/4a3?3w3W364g393b0l0@0l4m3j1l2*1a2V2I0S1;2N3-014v2U1r1i2)0x2+4E413I054v4V2b0G0S0/322D3B3d3Q0n4%4)4e4w384,1~2g0x4;4v3Y4y3c1T0w3h434q0@0V0m1W0x0W3)3I0n544N0c0@0A5c2E5e3,450/0?040o0N5k3k4X2E544:014*2:3B3D3;4/4(5A4=4~5D4_264{5I4}4x5L2F535n2Y010y0@0g2r0i5u5m4p4N0F0H0@2n245u5f5o015q0b5:5V2?56235_5)5=5h045j5w4#445W0W3D020E0O0c0P0p57590W0T0P0R0P6a6c6e5~3m5=5q0r5%5;5W0F0@0z356q662061632.5`1#680@6n6d0p0h6M6p646w206t6v6I3.0@243W2Q0d6C3L6F6(4N6K046Q0p160V0L0t6/6+6s0@0e6W5 5W5Y040,6}6r6x5|0s1L0x0h6_5W5q0J5u0_6S3K5z5B1`3!3r7j5J5R3b3#0n4`4|3_4@7r513h0n7B5(7420700V47736D3o0@1)2R7J6)0g0@2Q7P5*76787a7h6~6U0@7e647g6H4p7o4+3|7n5H3^4f7x0L3}7t5N7v7=3{7@7z047C817D7K6Y047N0x0Q2)2n2y7U605i8d75861M7O7Z7E1#610T7b5{040W1/0=8q1#5@6|7(6(7,5C4i7/7{4?7}4j7_278G5K8E5T80827B6T1#700G0V8g8r87892m4T8Y8n0@0k6G3j833L6-6/6^8l845?7$7f8B7:0Q7-0L4A4.7o5Q7?4A8K5O7;8H4h8 7 8R8R8T856g1X5b8?6)0@8p9k7V710C0C240S8w5p0@5^9o5=6y8i0d8k7*8m9w048z4n5:0w4!4F4U4H4R1a0P4K9S2L2G581X2F4I7g0Y0!0$0W04.

1.4 Comptons les moutons⚓︎

Nous avons donc récupéré l'ensembles des fables dans une liste contenant toutes les lignes. Nous pouvons désormais faire des requêtes sur cette liste.

Combien de vers contiennent le mot "mouton" ? Pour le savoir on fait :

Python
moutons = [vers for vers in fables if "mouton" in vers.lower()]  # tous les vers contenant "mouton"
print(len(moutons))  # le nombre de vers

Astuce

On passe le vers en minuscule avec vers.lower() afin de trouver en une seule passe les chaînes "mouton", "Mouton", "MOUTON", etc

Requêtes dans les fables

Compléter le script ci-dessous afin d'effectuer les requêtes demandées.

Toutes les recherches de chaînes de caractères seront insensibles à la casse (utiliser vers.lower() comme ci-dessus).

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013(og)5wrh36a j[;vc8lS/ekm=4èp9qnib1y-2]ut_îd.Pf7s0050R0w0O0l0G0t0W0m0r0t0l0W0W0z010O0G0C010406050W0N0y0y0l0h0J040u0c0t0N0=0c0F050v0|0~10120`0C04051i1b1l0v1i0`0R0G0q0*0,0.0:0,0F0d0N0l0d0w0K0C0J0O0i190m0i0G0d0i0t1N0i0O0^050#0H0t0w1u0-0/011M1O1Q1O0O1W1Y1U0O0h1j1I0*150W0C0l0F0:0L011!1w010U0%0w0F0l0y0w1U1_1{201$231Y26280^0a0m0T0h0c0C0c0W0G180F0m0Z1@0h0h0w0r2t1b2b0F1j0v1I2G1:1=1;1V0R2d1x0G0F252q1U1r1t0+1#2Q2S0F0c2W1U0C2z1j2E2G2-0{1`2u2Y212$0h0 0t1U0l1L2z0U0:030P0P0r2%0w1Q2#0c0K0I0I3b0^0m0I1b0l2.2;0_2:2c2?1$2^2`2|2~0w3001323436382T3b3d1~040m0L3i3k1{3m2E2P013r0l2{1j2}0i2 3133350Z3B2$3D0K0j3f0j3J2D3l0`3N3p0:3Q3S053U3W3x3Y3A2R3C3c0K0A3f0A3,1c3.3n2=1v3q0c2_3R3t3V3v3X3z3!3~3$400f3f0f452-3/2;3O3?4f3`3y3Z374l3a400k3f0k4r473:4a3=4c3s3T3u3w4z3}393%0V3f0V4I3L4t3o4L3P4N4e4P4g4R3|4k4U400s3f0s4Z2F4#492Z4(4d3@3_4h3{4j4B4:3d0D3f0D4^3M4u3;4}4O3^4Q4i4A3#4D3d0I0X0^5n5a4`4v4)4 5h525j4C3%3c5p3h0v3j3-4!485t4~4x514S4/3 5m3F0I3I5E3K4_5I5d4w4+4y4.545P3b3)040I3+5U5G5W4K4|5Z5g4,5i4T5(0I425+445.465H5;2@5u5L4-535k5A4o5+4q604s5X4%5?50675y553b4F5+4H6e4J5c6h655!5M5$69400I4W5+4Y6r626t5=6v5@5#685z6A4=5+4@6F2F1m2+1b2W2J0R1=2O5d4A2V1s1j2*0w2,3l5/1j4A6-2c0G0R0:332E5A3t6@6_6M6m0I1 2h0w6 6l5{1U5.631$0r7204030m1Q0W0O0w0P0I1@0F0=250O7h0w0)0q0w0h0)0R1{0)1Y0E0N370m0l0C1`0h0l0Q7s0,0*0i7M2S0m027E0c0O0p0y0c17197V0N7X0p6/0`616T3N6~016`2;3%3F5g7;6y6N3E7327757=705(7_7a6H2@0^7i7k7m6/0m6g4|0c0^0z8d8f210@040o6/8l3q0^7w7y8k7b0:0x0^0U4c8w878s048u0W8D4$8g0g0^2R8J4{88040U0l1X7u8P3O8z040G0U8X5d0W3F7(7*0r1N3R0w8+7Y8%4%0c8M8!1a7.3G8r3=8t7x8I8|8~018h040S8q8x3P898^7x998E0:8n0b0e0M7,9f6?6^826{405*7`9p7|6m3)0m74765`4m3d9t5U7-2/7:9v0P9r3d5}9u9B5O9D417 289Q5%9S9O868K217d0^7g8a7l0L7o7q7p7t7v912v7B7t7E7G7I7K7M7O2}0r7R0Q7T8;0p8-0d8/a49m939J6 9M0K6b9P82779S4o9z809W6z3dag9!8Q8F9*0P5T2-8e9a968j8|az9g018n8pabaF0F908vaD948Z8B0h8?5=aM92ay948^8N8{aX9aaL8S8U1YaW3laE9#1$8Z8#aT218)0^a4a6a87W8=aOaA8_8Oa aKaV9nat0:9698aJa/8 040t9daSbbb7aG0^9j9l8|9H6.ac9q7@4E6}9Kaj5l0K4Fam9Vai9Cby6o3Jbp3L5I7{9Lbt3d6Cah9w5(4WbB81bR9SbPas3O9%7f7h0G7j7l0j9-0G7r9:0m8H9?0F7C0w9_0t7H7J107M0.b.a+7Q7S7u7Ua}a58.1Ya40m0!c57)7Y8B0N2_0Ga9bob60mbLae6PbQ839S4=bUao7}0KcqbZ5Y89b(8b5-a$aFaBa?1$aHcmcB8G91cJ8y8A8Cb3bc9bcOaNcGcVaZ8`cQcW8T8Va,3La.bja;8$cUbja^04a`c88:c6c%c#b2cZbja(8HcM8@0^ba9Ib4bebgd34|9i0ec|8_1{0Rc%c?a4cgcickc 3Oc}a#a-94d1cPbidqd5db8Rbf0g9edx5dddbn6fdxcobN0K574PbLbx3%57cvbD9RbydObHcmdL1{5A5odPbwbEd%9UbVcsby5n795F9ab#9)cD7l0Ab,c0c4b;2w0C167z1Z0f0*b}2B0B2ze47h190d0m0b2R0+0N0WdecldK9Kae5Bd)cw7172dUbWd:7e3,a%cCb)0P5 dp5dcIc;3OcLdF6hb5eJ5daQcTeGeNcXc+2Fc-dqb1dsc,du8Aa*8WeP4%c/c%0F0H8925dAcKble?bdd2eMdc0^emeT8ga_0d7YaCf0210y0G0^eFbqaF8ndI47eoaddM5Sbvet5{1~ewd/5A853jbI7/4ud#0F5A9t2}dQd+6A9y9AdV9Xd:9Fd?aFd^b%eDe6357pb-9/c1e09@a+b_0)1K170%b(1Zc11A0%1Y280O0)0ba4e fgd79ofid$6A9OfBd*dW5A42fpdRf|d=6=d0eC8b6df61$eIgc9h0^aIf^g8eVc%eRbhgfcWe{gpdre.e(c*gm8Nc:gp0W7e02030j0D0pa4gDgF7+e+8La!gugle|8m0^ff5Hfhbsf{5magf~fm9S0IalfGex6ag6fug7cnepfjbGg#fHap6nd-g$d:bGcA4%fNav0kd}fUc42$0ye40)c)a+aagjg:f`fy6AbPg@g+hig{g^cx6Bg694fNeh0(0m8B9/e2ek2v1Zb+0re80Oeac42wbf1zcb7s0W197s250m0 0nek0r0N1Yf?gVhefx5Acqhkfq6Ohnhl5mczfLcVa(h2c|8ic%eLhecNgrdt9agngPh}e$b0gOgM8Rhbe*gpe-i63qe:bee=gRe@040be_gqdwh{4%8nhZeXaYf2f4c%f80^cFh~cHdg0Fdiice`infcc!dzihbd0N7JdEioe}ijir8}aA8if5iAh;eOiQgS04gU5W930v6;6U6,6W6)1b0O6Zi;2M2He)2G6X7-0Z0#0%0W04.

Les fichiers CSV (pour Comma Separated Values) sont des fichiers-texte (ils ne contiennent aucune mise en forme) utilisés pour stocker des données, séparées par des virgules (ou des points-virgules, ou des espaces...). Il n'y a pas de norme officielle du CSV.

2. Les fichiers csv et json⚓︎

2.1 Découverte⚓︎

Le site data.gouv propose de nombreux jeux de données en libre accès.

Les fichiers correspondants sont souvent proposés aux formats

  • csv pour Comma Separated Values,
  • json pour JavaScript Object Notation.

Ces deux formats de fichiers permettent de présenter des données textuelles. Voici par exemple les mêmes informations présentées dans chacun des formats :

  • au format csv (le fichier s'appelle amis.csv):

    📑 Données CSV
    nom,âge,ville,passion
    Jean,26,Paris,VTT
    Marion,28,Lyon,badminton
    
  • au format json (le fichier s'appelle amis.json):

    JSON
    { "amis": [
        {"nom": "Jean","âge": 26,"ville": "Paris","passion": "VTT"},
        {"nom": "Marion","âge": 28,"ville": "Lyon","passion": "badminton"},
              ]
    }
    

Nous travaillerons désormais avec les fichiers csv. L'exemple précédent permet de remarquer plusieurs choses :

  • un fichier csv contient des données textuelles,

  • les données sont organisées en lignes,

  • la première ligne regroupe le nom des descripteurs (il y en a quatre ici : nom, âge, ville et passion),

  • les autres lignes contiennent des enregistrements (il y en a deux ici : Jean,26,Paris,VTT et Marion,28,Lyon,badminton),

  • au sein de chaque ligne, les valeurs sont délimitées par un séparateur (ici le caractère ","),

  • les données peuvent être de types différents. Ici le nom, la ville et la passion sont des chaînes de caractères, l'âge un entier.

Attention

La réalité n'est pas aussi simple :

  • il arrive que la première ligne ne contienne pas les entêtes. Ils peuvent être listés dans un fichier annexe ou... perdus !

  • on trouve parfois une seconde ligne contenant les types des données (entier, texte...).

  • le séparateur n'est pas toujours une virgule. Il est courant que l'on trouve des ";" dans les fichiers français car la virgule est utilisée comme séparateur décimal.

Premiers contacts

On considère les deux fichiers csv ci-dessous (on n'en donne que les trois première lignes) :

📑 Données CSV
geo_point_2d;nb_equipement;commune;cp
(47.3392380011,0.7162219998);1;Chambray-lès-Tours;37170
(47.3300100011,0.6120900019);5;Ballan-Miré;37510
📑 Données CSV
session,academie,sexe,diplome_specialite,nombre_d_inscrits,nombre_d_admis_totaux
INT,TEXT,TEXT,TEXT,INT,INT
2021,AIX-MARSEILLE,FILLES,BAC PRO AG 21302 GEST MILIEUX NATURELS FAUNE,16,13

Cochez la ou les bonnes réponses.

  • Le séparateur du fichier petanque.csv est la virgule
  • Le fichier petanque.csv compte quatre descripteurs
  • Le séparateur du fichier bac.csv est la virgule
  • INT est un descripteur du fichier bac.csv
  • ❌ Le séparateur du fichier petanque.csv est le point-virgule
  • ✅ Le fichier petanque.csv compte bien quatre descripteurs
  • ✅ Le séparateur du fichier bac.csv est bien la virgule
  • ❌ INT est un type de données
Problème !

On propose ci-dessous un extrait d'un fichier csv. Identifiez les trois problèmes présents :

📑 Données CSV
nom,prenom,identifiant;mdp,derniere_connexion
Clark,Sarah,sclark,k012345,20230105,
Mapple,Marc,marc.mapple,20221231
Solution
  1. Le séparateur n'est pas constant : il y a un point-virgule dans la première ligne
  2. Il y a une virgule en trop en fin de deuxième ligne
  3. Il manque un champs sur la troisième ligne

On pourrait aussi noter le gros problème qui consiste à stocker les mots de passe des utilisateurs en clair dans un fichier !

Autres formats...

Les fichiers csv et json ne sont pas les seuls formats permettant de conserver des données.

On peut aussi retenir le format xml pour eXtensible Markup Language qui utilise des balises au même titre que le html :

📑 Données XML
<?xml version="1.0" encoding="UTF-8"?>
<amis>
    <personne>
        <nom>Jean</nom>
        <âge>26</âge>
        <ville>Paris</ville>
        <passion>VTT</passion>
    </personne>
    <personne>
        <nom>Marion</nom>
        <âge>28</âge>
        <ville>Lyon</ville>
        <passion>badminton</passion>
    </personne>
</amis>

2.2 Création⚓︎

On l'a dit, les fichiers csv et json sont des fichiers « texte » classique. Il est donc possible de les créer, d'ouvrir ou de modifier avec un simple éditeur de texte.

2.2.1 Ouverture/modification d'un fichier CSV par des logiciels classiques

  • Télécharger le fichier exemple.csv
  • Ouvrir avec le Bloc-Notes ce fichier.
  • Rajouter une ligne avec une personne supplémentaire, sauvegarder le fichier.
  • Ouvrir le fichier avec LibreOffice.

2.2.2 Création avec python

« Créer » un fichier csv

On souhaite « créer » un fichier csv recensant les jours fériés en France durant l'année 2023.

Afin de rester dans l'interface proposée par ce site nous travaillerons dans un éditeur Python.

Pour de vrai !

Au lieu de travailler dans l'éditeur Python proposé ci-dessous, vous pouvez utiliser votre propre éditeur et réellement créer le fichier csv en l'enregistrant avec l'extension .csv. Vous pourrez ensuite le lire comme vu plus haut. Remarquez qu'un "copié/collé" de cet écran peut vous faire gagner du temps. Il faudra juste le transformer un peu ...

Ces jours sont présentés dans le tableau ci-dessous :

motif jour numero mois
Jour de l'an dimanche 1 janvier
Lundi de Pâques lundi 10 avril
Fête du travail lundi 1 mai
Victoire 1945 lundi 8 mai
Ascension jeudi 18 mai
Fête Nationale vendredi 14 juillet
Assomption mardi 15 août
Toussaint mercredi 1 novembre
Armistice 1918 samedi 11 novembre
Noël lundi 25 décembre

Compléter la chaîne de caractère contenu ci-dessous en saisissant le contenu du fichier csv :

  • on saisira les descripteurs sur la première ligne,
  • on utilisera la virgule comme séparateur.

Vous pouvez saisir les descripteurs dans l'ordre que vous souhaitez, il faut par contre faire en sorte de saisir les valeurs dans le même ordre !

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013ogJrh6ajIv,ck4p9âRqb1F_tP7VL53û ;A8lS/em=niN:y-2éêudT.Cëfs0050!0N0y0h0R0K0*0G0m0K0h0*0*0P010y0R0p010406050*0Z0O0O0h0e0U040L0b0K0Z0 0b0Q0G020h0O0p0H0G0s0N190e0t0Z0N0*050M16181a1c140p04051H1A1K0M1H140!0R0k0@0_0{0}0_0Q0c0Z0h0c0N0V0p0U0y0f1j0G0f0R0c0f0K1:0f0y12050/0u0K0N1T0`0|011/1;1?1;0y1|1~1`0y0e1I1+0@1f0*0p0h0Q0}0W01201V010)0;0N0Q1n0N1`2i2k2p222s1~2v0O2x040a0G0z0e0b0p0b0*0R1i1k0-2g0e0e0N0m2S1A2z0Q1I0M1+2(2c2e2d1{0!2B1W0R0Q2u2P1`1Q1S0^212=2@0Q0b2{1`0p2X1I2$2(38152j1k2}2q310e190K1`0h1.2X0)0}030x0x0m320N1?300b0V0v0J3z120G0v1A0h393c133b2A3e223g3i3k3m0N3o013q3s3u3w2^3z3B2n040G0W3G3I2k3K2$2;013P0h3j1I3l0f3n3p3r3t0-3Z313#0V0E3D0E3+2#3J143/3N0}3=3@053_3{3V3}3Y2?3!3A0V0o3D0o471B493L3d1U3O0b3h3?3R3`3T3|3X3 4m414o0D3D0D4t384a3c3:4e4D4i3W3~3v4J3y4o0g3D0g4P4v4b4y4d4A3Q3^3S3U4X4l3x420A3D0A4*3-4R3M4-3;4/4C4;4E4?4k4I4_4o0J3D0J4~2%504x2~534B4f4h4F4j4H4Z5b3B0q3D0q5g3.4S4c5l4:4g4=4G4Y404#3B0v0+125L5y5i4T545n5F5q5H4!420v0v5N3F0M3H484 4w5R5m4V5p4@5a4n5K3%0v3*5%3,5h5+5B4U564W595s5=3z44040v465`5)2%1L361A2{2+0!2e2:5B4Y2`1R1I350N373J6b1I4Y6s2A0R0!0}3r2$5Y3R6z6B5r5I6E0G2F0N6H5W5t3C2(5(4,5k0Q123t0Q0y2u0Z6u0G5}520b120P6%6)5k0*3%021w0b0y0H6?0Z6^6`6@6_6u144u3-5+6G016C3c423%5E76626J4o2n6L2w6O4^647b6a6U2q6;120O6^0R0)0l0i0b0Z0e0l0Q170N2M0l7t0R1z735|7L6x1k7d0x6D4o667c6A776I5X7T2o6M7k5;4K3B7U7o5A527r040d7z0e0G2U0K02030E0q0H2k0l1Q190Q0m0f0N0l0v7x2k0k0R7F716u757W782k424q4;7Q6P644q7i2G7%637)4p1`7,516:3%0C0Z0Q1Q7@1 0z0r1w1y0l1g8E0R870+0l0h0k0e0;8e7N8g6H7S3B4M8m8h7Y6Q4M8r6N7X8o8v8%477p227/0w0Y6!7@0Z0G2c8T0:0K8M8D1Q877H0:8X3a3/7Q8#0V4%8(8t7f3B4%8-9i7Z9k8x6T7-8A120B0R2Z0b0R2X3E0q0o0D948O0l0J980R9a6t9c8)9e4{9h8/7l8v4{9m9S7(5J0V9Q8?9s7q3%0I0*0m2u2Q1j7x0N0Z963A9J9L749N8!795c6F8)8:9Z5d9W7e9o0V5d6S7O3:8_8{1 0S0h2S3?860k2u0!2X9?0o7x0Z0;1~0y9_6c9{7X9e5v9Ra56Q5va48*64aA9$8z9(129*0*0b1o2S980e9?9E0h0b0Fau7N729b4S9d9}5K5MaBaG8v5L7#7j9X8u9Za/a96/aL040#7z0{0:6Z7H7F0man8P8831ak0O0u2Xavaaa(8j4o5Z9 9n6QbiaFa15Y5!a_8@0}7/0I3h7J0 9,9B9@0*2w9?b70bb9bb0Nbd8Zaya)3z7b3l8n9Ta@7h7$a=9jbO9qaa5B7/0S0b0(938N960W9E0!0X9,babca!8fax8i0Q5Y7UbQa0bSb|a:8sbWa668bZa`8^6=6 6~6|6_6{6}bK0M6w6d6r6f6o1A0y6ico2.2)0h1}cl0M6g1Gb!522X0O0x0)0h0n0N0x0f661s1u8K0?0T8f1N3K1H0%aP2G0G2?1Q1w0X7@2k0?0K000X31830X0l0Gc*4Aam1 0-0?c_b4106!7A0?0Q003l2jc`000R1o4A0/830N0$0G0j0K0GcF1h0G2Q1o1~2G6Z0G8{9A3t0f0X2XdpcQcS1P1R3:1X1Z1#1%1)1+1-241=1@1_cA5k2D2u2w120z1*1,0Q8f6q7O5{6v3ube9O9}0q6R7Vbk4nd+5!bnc00vd:2o575Gd?d^br9%3O6X1j6!7D6.bs016+046-7N6(e67/cfcecbef0HbKb_7Rd*0VbPcYb 9Y3zd+bUa;aCd/eod_61a-4#euc7ed3%7D2G7G7I0*7H7u7w7y7Aeka%d)bgd+b}eqd.4KeWc28.exe!43eA5/e(eDe*d~aKc95N890Q8b7F0l7;7A8Gc;7`7|7~0Q80d72k84bJb@8Yel7Sd+8ld-c45bfde$eZe.8qd`5Vd|8we:5ja{5L8S8U0;0l8C8Oe~8IcO9F1QeS6yeUb{d@0V8=b~fketfLfjfgey8,fn5:a?fP8=8yfse=679J0l8`8|0!8~900k92fE9Kf9a$fH9|eV9fbjfSe)9lbVe-fP9lfVg1fK9gaJf#bt3%9I198P9v9x9z1 d@9Df;fG7PfIfP9#fNf}e.9Vg0eCgpe+58gwfK9#f!ab5@gc0:0l9*9,0Q9.f30i9;fFf?9MeTf_fJd+a8ffg5gWfRgZa7gyd{esfKgXgDb#5@ap0iar0Katf)ad0Gafah1~0lak8Eb5gmeYbMf`aIgrg$aEgvbofKaEg4gAd+aIg-7.5@aVaX0ygI0{aP0paR1ugQ4Qb^gTh4gV3za+gYhfhAg#hDa/5UfW7fd:hBhi9tf%b81tbI0la}0Za 2?hneJb40Nhu4vfahxb`fPbia,hbd:d;hafpbmheh.3zbqg8gE5#7CbGhR2XgIbw0*bygi0qbBbDf=hvh(f^hyh+epbRg*d:evc3g$5^g(foiibYfrh|04b-80b:i086b%b)glgR9`h)emf`c6h-h=44d=iqc6hIim7+9re;ga12eiiWcbchcj1N6ecx6o720-0/0;0*04.

3. Exploitation d'un fichier CSV en Python⚓︎

L'utilisation d'un tableur peut être délicate lorsque le fichier CSV comporte un très grand nombre de lignes. Python permet de lire et d'extraire des informations d'un fichier CSV même très volumineux, grâce à des modules dédiés, comme le bien-nommé csv (utilisé ici) ou bien pandas (qui sera vu plus tard).

3.1 Première méthode. Création d'une liste⚓︎

Le script suivant :

Python
1
2
3
4
5
6
7
8
import csv                          
f = open('exemple.csv', "r", encoding = 'utf-8') # le "r" signifie "read", le fichier est ouvert en lecture seule
donnees = csv.reader(f)  # donnees est un objet (spécifique au module csv) qui contient des lignes

for ligne in donnees:               
    print(ligne)

f.close()    # toujours fermer le fichier !

donne :

Python
['Prénom', 'Nom', 'Email', 'SMS']
['John', 'Smith', 'john@example.com', '33123456789']
['Harry', 'Pierce', 'harry@example.com', '33111222222']
['Howard', 'Paige', 'howard@example.com', '33777888898']

Problèmes

  1. Les données ne sont pas structurées : la première ligne est la ligne des «descripteurs» (ou des «champs»), alors que les lignes suivantes sont les valeurs de ces descripteurs.
  2. La variable donnees n'est pas exploitable en l'état. Ce n'est pas une structure connue.

3.2 Améliorations. Créaction d'un dictionanire⚓︎

Au lieu d'utiliser la fonction csv.reader(), utilisons csv.DictReader(). Comme son nom l'indique, elle renverra une variable contenant des dictionnaires.

Le script suivant :

Python
1
2
3
4
5
6
7
8
import csv
f = open('exemple.csv', "r", encoding = 'utf-8')
donnees = csv.DictReader(f)

for ligne in donnees:
    print(dict(ligne))

f.close()

donne

Python
{'Prénom': 'John', 'Nom': 'Smith', 'Email': 'john@example.com', 'SMS': '33123456789'}
{'Prénom': 'Harry', 'Nom': 'Pierce', 'Email': 'harry@example.com', 'SMS': '33111222222'}
{'Prénom': 'Howard', 'Nom': 'Paige', 'Email': 'howard@example.com', 'SMS': '33777888898'}

C'est mieux ! Les données sont maintenant des dictionnaires. Mais nous avons juste énuméré 3 dictionnaires. Comment ré-accéder au premier d'entre eux, celui de John Smith ? Essayons :

Python
>>> donnees[0]

    ---------------------------------------------------------------------------

    TypeError                                 Traceback (most recent call last)

    <ipython-input-3-9914ab00321e> in <module>
    ----> 1 donnees[0]


    TypeError: 'DictReader' object does not support indexing

3.3 Une liste de dictionnaires⚓︎

Nous allons donc créer une liste de dictionnaires.

Le script suivant :

Python
1
2
3
4
5
6
7
8
import csv
f = open('exemple.csv', "r", encoding = 'utf-8')
donnees = csv.DictReader(f)
amis = []
for ligne in donnees:
    amis.append(dict(ligne))

f.close()

permet de faire ceci :

Python
>>> amis

    [{'Prénom': 'John',
      'Nom': 'Smith',
      'Email': 'john@example.com',
      'SMS': '33123456789'},
     {'Prénom': 'Harry',
      'Nom': 'Pierce',
      'Email': 'harry@example.com',
      'SMS': '33111222222'},
     {'Prénom': 'Howard',
      'Nom': 'Paige',
      'Email': 'howard@example.com',
      'SMS': '33777888898'}]

>>> print(amis[0]['Email'])
    john@example.com

>>> print(amis[2]['Nom'])
  Paige

3.4 Import d'un fichier csv dans une liste de listes⚓︎

On considère le fichier temperatures_2020.csv. Ce fichier regroupe les températures minimales, maximales et moyennes dans différentes régions françaises pour certains jours de l'année 2020. Il est dans le dossier de travail et est encodé en utf-8.

Les premières lignes du fichier sont données ci-dessous :

📑 Données CSV
mois,jour,région,tmin,tmax,tmoy
août,13,Pays de la Loire,19.25,25.35,22.3
août,13,Occitanie,17.51,26.55,22.03
Repérer les bonnes informations

Observez l'extrait proposé et répondez aux questions suivantes :

  1. Quel est le séparateur utilisé ?
  2. Combien y-a-t-il de descripteurs ?
  3. Quels sont les types des descripteurs ? (entier, nombre décimal, chaîne de caractères...)
Solution
  1. Le séparateur est la virgule
  2. Il y a six descripteurs
  3. mois et région sont des chaînes de caractères, jour est un entier, les trois autres sont des flottants.

Un fichier csv est un fichier contenant des données textuelles : son importation avec Python peut se faire facilement avec open.

On propose dans un premier temps d'importer les données dans une liste de listes. Voici un code fonctionnel :

Important

Prenez le temps de lire les commentaires !

Cliquez sur les +

Python
temperatures = []
with open(file="temperatures_2020.csv", mode="r", encoding="utf-8") as fichier:
    fichier.readline()  # (1)
    for ligne in fichier:  # (2)
        ligne_propre = ligne.strip()  # (3)
        valeurs = ligne_propre.split(",")  # (4)
        temperatures.append(valeurs)
  1. ⚠ Les descripteurs ne sont pas utilisés : on lit la première ligne sans l'ajouter au résultat ⚠
  2. 👓 Parcours et lecture de toutes les lignes restantes 👓
  3. 🧹 on ôte le \n en fin de ligne 🧹
  4. ✂ on découpe la ligne à chaque caractère "," en une liste de valeurs ✂

On obtient le résultat suivant :

Python
temperatures = [
    ["août", "13", "Pays de la Loire", "19.25", "25.35", "22.3"],
    ["août", "13", "Occitanie", "17.51", "26.55", "22.03"],
    ["août", "14", "Pays de la Loire", "17.7", "25.7", "21.7"],
    ...
]

Les données ont bien été importées mais elles sont mal typées : les températures sont par exemple stockées sous forme des chaînes de caractères. Sous cette forme la somme "19.25" + "26.55" renvoie "19.2526.55" !

Il reste donc à typer les données. Par défaut celles-ci sont toutes au format str. Seuls les nombres entiers et les décimaux sont à typer.

On rappelle les indices ci-dessous :

Descripteur mois jour région tmin tmax tmoy
Indice 0 1 2 3 4 5
Type Python str int str float float float

Il est possible de typer toutes les valeurs à l'indice 1 en faisant :

Python
for entree in temperatures:
    entree[1] = int(entree[1])  # int convertit une chaîne de caractère en un entier
Import et typage complets

Compléter le script ci-dessous permettant d'importer et de typer convenablement les données du fichier temperatures_2020.csv.

On rappelle que float permet de convertir une chaîne de caractère en un flottant.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013og)rh6ajIv,ck4p9Rqb1]_tP7(5w3 [;OA8lS/em=èni:y-2éudT.fs0050Z0N0x0h0S0K0%0E0m0K0h0%0%0P010x0S0p010406050%0Y0O0O0h0e0U040L0b0K0Y0|0b0R0E020h0O0p0G0E0r0N160e0s0Y0N0%050M13151719110p04051E1x1H0M1E110Z0S0k0;0?0^0`0?0R0c0Y0h0c0N0V0p0U0x0f1g0E0f0S0c0f0K1-0f0x0 050,0t0K0N1Q0@0_011,1.1:1.0x1_1{1@0x0e1F1(0;1c0%0p0h0R0`0W011}1S010$0.0N0R1k0N1@2f2h2m1 2p1{2s0O2u040a0E0y0e0b0p0b0%0S1f1h0*2d0e0e0N0m2P1x2w0R1F0M1(2#292b2a1^0Z2y1T0S0R2r2M1@1N1P0=1~2/2;0R0b2^1@0p2U1F2Z2#35122g1h2`2n2~0e160K1@0h1+2U0$0`030w0w0m2 0N1:2}0b0V0D0u0V0u0 0E0u1x0h363910382x3b1 3d3f3h3j0N3l013n3p3r3t2=3w3y2k040E0W3E3G2h3I2Z2.013N0h3g1F3i0f3k3m3o3q0*3X2~3Z3w3B0D3)2Y3H113-3L0`3:3=053@3_3T3{3W2:3Y3x0V0o3B0o441y463J3a1R3M0b3e3;3P3^3R3`3V3}4j3 4l0B3B0B4q3547393.4b4A4f3U3|3s4G3v4l0g3B0g4M4s484v4a4x3O3?3Q3S4U4i3u400z3B0z4%3+4O3K4*3/4,4z4.4B4:4h4F4?4l0J3B0J4{2!4}4u2{504y4c4e4C4g4E4W583y0q3B0q5d3,4P495i4-4d4/4D4V3~4Y3y0u0(0 5I5v5f4Q515k5C5n5E4X400u3A045W5M4t5O5j4S5m4;574k5H3#0u3(0M3F454|5#5y4R534T565p5,3z0D5K435;3*5e5^4 5`5B545D4=5 0u4n5Y4p645?664)5h695l555o5F5V4J5Y4L6j4r3+1I331x2^2(0Z2b2-5y4V2@1O1F320N343H6k1F4V6P2x0S0Z0`3o2Z5V3P6W6Y6r5U4l3A0E2C0N6(5T5q3z1@6j6m2n0m5X030E0j1l4x0x6R116y2!5#6%016Z39403#5B785}6s4l2k6-2t6:6d4H3!6@5=6_3M0 0x1q0p0N0e0h0x0Y2U1w753$675h0b0 0P6R0E7H2n0~040F0v736R776X790w6!4l614.7f6)6=617k2D7m5+7o412#7r5x4 0n0 0C2O0f7M7O3M0t0 2K2r7V7s0`7Q0A857@6n0 2A0N8a4~7I7K8g5g2n0%3#021t0b0x0G7v1l7y7A7C1v0w0W0(8B0#0m0%0k8p0Y8r0G8k3.7Q0l7~863/0 0O3r8M5y7J047L7F7 0`8n0 8I8K0e8*8s8W4 8O8Q8b3c0 2r3|2:0c8/8i8Z8}8m8o8q8s1e0$0V0J8-8L8#8R7Q0d8=8h2n7_040@9f8l7t042p0m1,7y901 7Q0T7U9b4P7(7!3y6g7e7X7g6*9C2l6.7.5~7:9D640E9Q7N8R0R8d0S9q0S9s9y9g1 8Y0#9t4a0 2U0h0Z3X9)01889e7F74373-9A7b4I6$9F7)5 4J7,6/7Y6;a17q3$9R8$019i0$4x9l4Q0 232;ag8X0C0 2:al689V9X9Z9_8?9u0 9w9@8M9{2h404!7%9 a67:4!a39L7h3yaF3)9RaR9Saw9*04aj0N0w322K2Uaq8~8!35aT9#aVaX9:9%9:9U040%290}9:9=9xav6V9 9B0V4^aGaM9Hb19J7la57n5Gb67=a9aSa+9maV0k3;0N7C7Ea*ab8Ya)3HbgahaW1-2;aZ2J6Na/0 9(9!bh8Sa?0p1:72bE8N0 89bL5y8(04990l99a`0 9?4NaBa 9|3y5ab3b97/bb5aaLb*9Mb,a8bf9Qaba=8u7x7z7B7DbB04bDa}bFa=0h0p7x0R0ZbW04bOc2bubj1{bmcabY4sbLaC0R405sb)9G6=5sb.cr5 cp3)9^6Q9`b#aD6+5Jcqa07:5Ib77-b/aN3zcF448R6{0 6}0!0U2g1Za|cA9zcCcn6+5X9Eb46=5WcKa4cvcIc)6^aUac8daf7Fbt5_8^0R290N8fc{bpan04apd39T7u7w8wb}1vcaazbZclc$5V7d3i7(aIbb5/c.c+6e7d9Paad9042rd0d2cd5y7Q0F9:0O0S5Kca7Td8c@bqa%3c81d6c caccc!a,bGdz2UdBdWbFdEdGdI5YdKcj5@di6(b00u7$c*cMb5d=drd^c,d?dvb@dxdZd1cadFbP4 dH0 63dC8:0 dLbo8RdOdMdX0RdR0$0K0b7AdUa;c~dAe4d)e9d,cZ6zcBd:b$3z9DdmaHba5V4ncucHdp9O3FaRb^esd!eue65he8046ieb5h7Qeebsbp8jeic3elenepeU7PbNerdyc eSe/ax7ReveXexaAd/7Yd;6ud@c:dpa29Kd|6ef3d c|are?ete_870 e5eZ2neW6wfle`e$3+fda(dP808de-bKfpficbe=e2d#ezc@d(fh01fne~dh370M6T6A6O6C6L1x0x6FfV2+2$0h1`fS0M6D1D6UbF2U0O0w0$0h0naY0f7$1p1r1t1v0Edg6Q1K3I1E0H1h7x1e0E0h0Y0^0S0E0xcW7y0E1{0:0Z1g0R0Xf|0Z0Q0:0K000S700e0,2Pf}1I3I2^3.1U1W1Y1!1$1(1*211/1;1?f+3.8e6.0 0y1%1)0R7V6Nf+656S3rgOcm3w0W6?cGdog)6?eKg-0Dg*6,6b5SeHg=g+cQc@b_dbb|8ybne%ege)effHfjfr66f07acDg*dl0Edng`hfd{f5g.7jg^5*b:hna8ab9i7{1(fv4adR83gWfJ88e=8eb brfGdXbR99b`dch28A8C0(8E8GbVhD0 8Pe*bu8U0*hH9:hL930G8,h*cahYh7ejc~8`1Vh%fJh)8J940x9698h-hW04d-2!ft9h0 9khZc}9o9W9r0edfey76eAf19|g*d?eFds4HilhleLg.7+hphmg{d~eOdwg~asidb c1d$bu9,9.4jdUi33Ihc7Zik4m9~io4Yg*eJf8iwiV2livisg{eNbei51 adc`h:c3aibwfFi4d4aohCi.bu9piDi1f~d.cdg(g{f3inf9ip0Vf7b8iYj8i!5|i$g*fbizbfeQbv0cbxa!bAi94 ehi`iaa.fJa:fJa=a@0ea_i10AiMczhJ1hj2g*aPj5jbaKiXjf0VaKi#g;jKb=b?jkcfbl0eh3fse(8 jq8cjljnbza$jwbCe=2fbJeqh_92h{0GbUi0fA9;bXigg%djg{b2f4jQ4^g:hjb65Rhq7hg*k6fcePcR6|0EcVcXi=iNj1k4g*b(k7jU97irkwb-jTkbkukiiAh;04jZchi1fkiG5yeW3Di1ha7Gh5j)jt68dR2:fzkMecfCjy0 kIj#eTj kOfMckkreBhe0VcxjMjQctjPkwctkBb+g.cxkEe0c@i,iej*8@dS1N0mkpi*0`0bd5d7kVe!fje|eak!lj04h/h4c@eWeYlne:lphyfKd*folvfqi hbk:ijk=cJg,kbcJkak g{lMk~hrlPcPl2aSjYbkkJj fIj a=2:lakpabe#lyjslreje,eokZjHbMk$l$k(lYk*kKe=l(9Wl*9cedjFb!k;c%g?c)k^kwc-lNlSm9jd5)jbc-bdb?ld01cS046}0I0i0bg62R0?6-mu0k3s1{ggi;k27Wm7g.dqlKlOg?7jk{lLhojemcdujilWdxhNh1b~j:c0e=c5c7c9jDe=k)j$ihh8i2mFfPg$fR2#f)6C0+0-0/04.

4. Une application : les joueurs de rugby du TOP14⚓︎

Le fichier top14.csv contient tous les joueurs du Top14 de rugby, saison 2019-2020, avec leur date de naissance, leur poste, et leurs mensurations.

Ce fichier a été généré par Rémi Deniaud, de l'académie de Bordeaux.

Exercice 1

Stocker dans une variable joueurs les renseignements de tous les joueurs présents dans ce fichier csv.

Correction
Python
1
2
3
4
5
6
7
8
import csv
f = open('data/top14.csv', 'r', encoding = 'utf-8')
donnees = csv.DictReader(f)
joueurs = []
for ligne in donnees:
    joueurs.append(dict(ligne))

f.close()

4.1 Première analyse⚓︎

Exercice 2

Combien de joueurs sont présents dans ce fichier ?

Correction
Python
>>> len(joueurs)
595

Exercice 3

Quel est le nom du joueur n°486 ?

Correction
Python
>>> joueurs[486]['Nom']
'Wenceslas LAURET'

4.2 Extraction de données particulières⚓︎

Exercice 4

En 2019, où jouait Baptiste SERIN ?

Correction

La méthode la plus naturelle est de parcourir toute la liste jusqu'à trouver le bon joueur, puis d'afficher son équipe.

Python
>>> for joueur in joueurs :
        if joueur['Nom'] == 'Baptiste SERIN' :
            print(joueur['Equipe'])

Une méthode plus efficace est d'utiliser une liste par compréhension incluant un test.

Python
>>> clubSerin = [joueur['Equipe'] for joueur in joueurs if joueur['Nom'] == 'Baptiste SERIN']
>>> clubSerin

Exercice 5

Qui sont les joueurs de plus de 140 kg ?

Attention à bien convertir en entier la chaine de caractère renvoyée par la clé Poids, à l'aide de la fonction int().

Correction
Python
>>> lourds = [(joueur['Nom'], joueur['Poids']) for joueur in joueurs if int(joueur['Poids']) > 140]
>>> lourds

5. Exploitation graphique⚓︎

Nous allons utiliser le module Matplotlib pour illustrer les données de notre fichier csv.

Pour tracer un nuage de points (par l'instruction plt.plot), Matplotlib requiert :

  • une liste X contenant toutes les abscisses des points à tracer.
  • une liste Y contenant toutes les ordonnées des points à tracer.

5.1 Exemple⚓︎

Python
1
2
3
4
5
import matplotlib.pyplot as plt
X = [0, 1, 3, 6]
Y = [12, 10, 7, 15]
plt.plot(X, Y, 'ro') 
plt.show()
Dans l'instruction plt.plot(X, Y, 'ro') :

  • X sont les abscisses,
  • Y sont les ordonnées,
  • 'ro' signifie :
    • qu'on veut des points (c'est le 'o', plus de choix ici).
    • qu'on veut qu'ils soient rouges (c'est le 'r' plus de choix ici).

png

5.2 Application⚓︎

Exercice 6

Afficher sur un graphique tous les joueurs de rugby du Top14, en mettant le poids en abscisse et la taille en ordonnée.

Correction
Python
1
2
3
4
X = [int(joueur['Poids']) for joueur in joueurs]
Y = [int(joueur['Taille']) for joueur in joueurs]
plt.plot(X, Y, 'ro') 
plt.show()

png

Exercice 7

Faire apparaître ensuite les joueurs évoluant au poste de Centre en bleu, et les 2ème lignes en vert.

Correction
Python
#tous les joueurs
X = [int(joueur['Poids']) for joueur in joueurs]
Y = [int(joueur['Taille']) for joueur in joueurs]
plt.plot(X, Y, 'ro') 

#on recolorie les Centres en bleu
X = [int(joueur['Poids']) for joueur in joueurs if joueur['Poste'] == 'Centre']
Y = [int(joueur['Taille']) for joueur in joueurs if joueur['Poste'] == 'Centre']
plt.plot(X, Y, 'bo')

#on recolorie les 2ème ligne en vert
X = [int(joueur['Poids']) for joueur in joueurs if joueur['Poste'] == '2ème ligne']
Y = [int(joueur['Taille']) for joueur in joueurs if joueur['Poste'] == '2ème ligne']
plt.plot(X, Y, 'go')


plt.show()

png