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

.1280134r[S=ykP)_5(gf8lumpinh1ec./x]2d3, b-owt:vas050F0y0N0Q0u0q0R0I0z0q0Q0R0R0f010N0u0t010406050R0r0s0s0Q0c0g040e0L0q0r0,0L0v050B0?0^0`0|0;0t04051c151f0B1c0;0F0u0P0!0$0(0*0$0v0n0r0Q0n0y0K0t0g0N0w130I0w0u0n0w0q1H0w0N0/050V0J0q0y1o0%0)011G1I1K1I0N1Q1S1O0N0c1d1C0!0 0R0t0Q0v0*0E011U1q010o0X0y0v0Q0s0y1O1:1=1`1W1}1S20220/0a0I0i0c0L0t0L0R0u120v0I0T1.0c0c0y0z2n15250v1d0B1C2A1*1,1+1P0F271r0u0v1 2k1O1l1n0#1V2K2M0v0L2Q1O0t2t1d2y2A2%0=1;2o2S1{2W0c0_0q1O0Q1F2t0o0*030k0k0z2X0y1K2V0L0K0l0K0x0/0x150Q2(2+0:2*262-1W2/2;2?2^0y2`012|2~30322N350K1^040E3b3d1=3f2y2J013k0Q2=1d2@0w2_2{2}2 0T3u2W3w0G0/0G3B2x3e0;3F3i0*3I3K053M3O3q3Q3t2L3v360b0/0b3Z163e1g2#152Q2D0F1,2I3(013R231d411e3 2)3|3D05482$2+0I0u0F0*2}2y3w383L4l4n013:3S3=3U36380I2b0y4o3s4y334r1O0B3c3g2,1p3j0/0o0Q1R0y0R3!3D0I4O3G0L0/0f4Y2z4!3%4Q0*0.040d0D4*3f4f2z4#4m4G4q363y3,4u4G483T344 1_4E533;4J572A4N4-2T010h0/0M2m0w4@4,4k460v0J0/2i1 4@4#464:0m5x5g2.4S1~5C5q4.014%044)4_4j3h5J0R3y1|4U1S0R0A0N0C1N5H5Q5h4:0H5o5y5J0v0/0s305$4P5h5L5N2)5D1W5S0/010c015=3G5)5+5{3)0/1 3R2L0n62465^6d5R5T110o0K0p615O5,5(0/0j655I5h5j040%6t5%5E041}0z1G0y0c6g6q040O4@0;6o3F4|4w0k4~0K3W4t6Q4x314z566U58214F6R546!3V4L3c0I6:5p6A1W6w0o0L6H5O6=5?6B1!2M6z6~1W0L0M0/2L723G5.6C0u6E0u6G6I1{4:6L5O6N5`4k6X6S2+3w3^6W4v6Y557s6%225a4I3?0K7t3B6;7H6}7a4S5V4W7h740/0A7O676x0t0t1 0F7S015A7Z7b700y7Z4:6s7l5x0B4i3~0y2A4b2B43152E7`7M7?1m4^0T0V0X0R04.

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

.1280134r[S=y9kP)_5(gf8l6umpinh1ec./x!]2d3, b-owt:vas050I0A0Q0T0w0r0U0L0B0r0T0U0U0f010Q0w0v010406050U0t0u0u0T0c0g040e0O0r0t0/0O0x050D0_0{0}0 0@0v04051f181i0D1f0@0I0w0S0%0)0+0-0)0x0o0t0T0o0A0N0v0g0Q0y160L0y0w0o0y0r1K0y0Q0=050Y0M0r0A1r0*0,011J1L1N1L0Q1T1V1R0Q0c1g1F0%120U0v0T0x0-0H011X1t010p0!0A0x0T0u0A1R1?1^1}1Z201V23250=0a0L0j0c0O0v0O0U0w150x0L0W1;0c0c0A0B2q18280x1g0D1F2D1-1/1.1S0I2a1u0w0x222n1R1o1q0(1Y2N2P0x0O2T1R0v2w1g2B2D2*0^1@2r2V1~2Z0c0|0r1R0T1I2w0p0-030l0l0B2!0A1N2Y0O0N0h0N0z0=0z180T2+2.0?2-292:1Z2=2@2_2{0A2}012 3133352Q380N1{040H3e3g1^3i2B2M013n0T2^1g2`0y2|2~30320W3x2Z3z0J0=0J3E2A3h0@3I3l0-3L3N053P3R3t3T3w2O3y390b0=0b3$193(3j2/1s3m0O2?3M3p3Q3r3S3v3V3^3X390m0=0m3~2*3)2.3J3-483;3u3U344e37390s0=0s4k3h1j2(182T2G0I1/2L3+014t2S1p1g2%0A2)4C3 3G054t4T290w0I0-302B3z3b3O0L4#4%4c4u364*1|2e0A4/4t3W4w3a1R0D3f414o0=0p0T1U0A0U3%3G0L524L0O0=0f5a2C5c3*430-0;040d0G5i3i4V2C524.014(2.3z3B3/4-4$5y4:4|5B4@244_5G4{4v5J2D515l2W010i0=0P2p0y5s5k4n4L0x0M0=2l225s5d5m015o0n5.5T2;54215@5%5:5f045h5u4Z425U0U3B1 561V0U0C0Q0E1Q5|3k5:5o0K5#5/5U0x0=0u336g641~5 612,5^1Z660=010c016s3J6j6l6y3,0=223U2O0o6F5e5g6Q5:6A0401140p0N0q6E626m1~5o0k6I5}5U5W040*6,6h6n5`0B1J0A0c6T5U5o0R5s0@6%3I5x5z1^3Y3p755H5P393Z0L4^4`3@4=7d4 3f0L7n5$6?1~6/0p456=6t3m0=1%2P7v3J0O0P0=2O7B5(6^6`6|736-6)0=7062726x4n7a4)3`795F3?4d7j0N3{7f5L7h7#3_7%7l047o7;7p7w6K047z0A0l2%2l2w7H5~6S627?537_1K7A7M7q1Z5 0C6}5_040U1-0:8e1Z5=6+7R6F7V5A4g7Y7+4;7-4h7)258u5I8s5R7:7=7n6(1Z6/0w0p806@860o2P7|2k4R8M6u0=0F6w3h844L6V016$7T8a5n7P718p7Z0l7W0N4y4,7a5O7$4y8y5M7!8v4f8=7/8F8F8H7^555759897@018c8k7^0T0v0v220I9e5;0=5?9a857`9l6*8-6%0D4Y4D4S4F4P180Q4I9C2J2E699z0D4G720W0Y0!0U04.

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î4r[S=0èy9kP)_5(gf8l6umpinh17;ecq./]2d3 b-owtvasj050M0F0T0V0z0u0W0O0G0u0V0W0W0g010T0z0y010406050W0w0x0x0V0d0j040f0R0u0w0=0R0A050J0|0~10120`0y04051i1b1l0J1i0`0M0z0U0*0,0.0:0,0A0r0w0V0r0F0Q0y0j0T0B190O0B0z0r0B0u1N0B0T0^050#0P0u0F1u0-0/011M1O1Q1O0T1W1Y1U0T0d1j1I0*150W0y0V0A0:0L011!1w010s0%0F0A0V0x0F1U1_1{201$231Y26280^0a0O0m0d0R0y0R0W0z180A0O0Z1@0d0d0F0G2t1b2b0A1j0J1I2G1:1=1;1V0M2d1x0z0A252q1U1r1t0+1#2Q2S0A0R2W1U0y2z1j2E2G2-0{1`2u2Y212$0d0 0u1U0V1L2z0s0:030o0o0G2%0F1Q2#0R0Q0C0C3b0^0O0C1b0V2.2;0_2:2c2?1$2^2`2|2~0F3001323436382T3b3d1~040O0L3i3k1{3m2E2P013r0V2{1j2}0B2 3133350Z3B2$3D0Q0N3f0N3J2D3l0`3N3p0:3Q3S053U3W3x3Y3A2R3C3c0Q0c3f0c3,1c3.3n2=1v3q0R2_3R3t3V3v3X3z3!3~3$400p3f0p452-3/2;3O3?4f3`3y3Z374l3a400v3f0v4r473:4a3=4c3s3T3u3w4z3}393%0D3f0D4I3L4t3o4L3P4N4e4P4g4R3|4k4U400t3f0t4Z2F4#492Z4(4d3@3_4h3{4j4B4:3d0k3f0k4^3M4u3;4}4O3^4Q4i4A3#4D3d0C0h0^5n5a4`4v4)4 5h525j4C3%3c5p3h0J3j3-4!485t4~4x514S4/3 5m3F0C3I5E3K4_5I5d4w4+4y4.545P3b3)040C3+5U5G5W4K4|5Z5g4,5i4T5(0C425+445.465H5;2@5u5L4-535k5A4o5+4q604s5X4%5?50675y553b4F5+4H6e4J5c6h655!5M5$69400C4W5+4Y6r626t5=6v5@5#685z6A4=5+4@6F2F1m2+1b2W2J0M1=2O5d4A2V1s1j2*0F2,3l5/1j4A6-2c0z0M0:332E5A3t6@6_6M6m0C1 2h0F6 6l5{1U5.631$0G7204030O1Q0W0T0F0o0C1@0A0=250T7h0F0)0U0F0d0)0M1{0)1Y0H0w370O0V0y1`0d0V0b7s0,0*0B7M2S0O010x0R1719016/0`616T3N6~016`2;3%3F5g7*6y6N3E7327757+705(7/7a6H2@0^7i7k7m6/0O6g4|0R0^0g8688210@040e6/8e3q0^7w7y8d7b0:0l0^0s4c8p808l048n0W8w4$890S0^2R8C4{81040s0V1X7u8I3O8s040z0s8Q5d0W3F010G1N3R298W4%0R8F8T1a7%3G8k3=8m7x8B8/8;018a040I8j8q3P828+7x8 8x0:8g0q0n0K7#956?6^7{6{405*7:9f7=6m3)0O74765`4m3d9j5U7$2/7)9l0o9h3d5}9k9r5O9t417^289G5%9I9E7 8D217d0^7g837l0L7o7q7p7t7v8@2v7B7t7E7G7I7K7M7O2}0G7R0b7T8!8$1.9c8_9z6 9C0Q6b9F7{779I4o9p7_9M6z3da39Q8J8y9W0o5T2-87908|8c8/am96018g8i9~as0A8?8oaq8`8S8u0d8)5=az8^al8`8+8G8.aK90ay8L8N1YaJ3lar9R1$8S8UaG218Y0^9`0r8%7!aBan8,8Ha.axaI9dag0:8|8~awaY8=040u93aFa}a_at0^999b8/9x6.9 9g7-4E6}9Aa65l0Q4Fa99La59sbk6o3Jbb3L5I7;9Bbf3d6Ca49m5(4Wbn7`bD9IbBaf3O9T7f7h0z7j7l0N9Z0z7r9$0O8A9)0A7C0F9,0u7H7J107M0.bWaU7Q7S7u7U8#a+1.0O0!7U8u0w2_0za-6fb40Obxa16PbC7|9I4=bGab7?0Qc8bL5Y82bQ845-aPasaoa$1$aua^4va@a=a~01aD8vcxb5aR8Acra`a:aOaW8`aR8M8OaV3LaXb5a!8VcC3Oa(04a*a,cG8{cIc#cE8@cu5da{c+6h920S94c45d980nc#aM041{0Mc#cX227Xc0c2cKa/aNc(cw9ycp0^a|dacyaRb1c;b3deb5c^b9c3dkc59Aa1574Pbxbj3%57cdbp9Hbkdtbtcuc6bz3b5odubibq5A5odzbIbk5n795F90bN9Vcl7l0cbUb/b?bZ2w0y167z1Z0p0*b,2B0i2zd,7h190r0O0q2R0+0w0Wc_badFdrdH5BdKce7172dPcadR7e3,aQckbR0o5 cocycqcVc@0^avdpcj8zc*eo4%cAdjd5a?euaAelb5c{a;eEcvaScOc#cTc(0P8225c.4|98eS8KcFc?4%8ge1eIc,0^020r0T0Eape$4%0xc104ekbcas8gdn47c4dG1{5A7/2}dvdM6A1~ebdwf4dT3me|e4e~6A9jf1dLdB5A9o9qdA9NdR9vdUasdWbPeid.357pbV9#b:d(9*aUb(0)1K170%bQ1Zb:1A0%1Y280T0)0q01e#e{dpe}0A5A9Efge85{42f6f35m9Pfqdfeh846de.898bc#cteYaHeCcP2FcR8R8tcBf=eWevg31$eGcJcQcL8taT8Pew4|eNgfa%7e000100c`c%gi8yeXeseZ0^e`5Hfba0e5a3f#fmac3ba8fldQ6af9bu7(4ufX5AbsgCgI6AbmgHecgPf98`fsai0vd#fzb?2$0xd,0)cNaU9}fWfcfY6AbBgRgWg@9KbHg`5mbKf-b5fsd|0(0O8u9#d*d 2v1ZbT0Gd:0Td=b?2wb11zb{7s0W197s250O0 0Xd 0G0w1YfUgxg;gzfd5mc8g_f7hEg|f$9I0Cchh1eJg#c`f@gq97eqeVgrg5eAcyeyd8f|god7hT91eKg/h*ghg63=ePb0eRf`8fb7hWa gse@cye!hR04e)e+e-hZb5e:0^cni63Oc{c}h$h}bvandch{h+0w7Jc=gteTb7hzf~aL8bi5gaegh%h^csgvg:6.0J6;6U6,6W6)1b0T6ZiL2M2Hgd2G6X7$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

.128013NéS=P5gf6piênhI7eq/CV3, b-oûë:vLJA4r0y9k_T8lum1;c.âF2dRtasj050$0r0(0)0l0S0*0y0X0S0)0*0*0e010(0l0k010406050*0T0U0U0)0K0M040d0B0S0T0 0B0n0y020)0U0k0W0y0%0r190K0s0T0r0*050t16181a1c140k04051H1A1K0t1H140$0l0F0@0_0{0}0_0n0h0T0)0h0r0A0k0M0(0o1j0y0o0l0h0o0S1:0o0(12050/0z0S0r1T0`0|011/1;1?1;0(1|1~1`0(0K1I1+0@1f0*0k0)0n0}0#01201V010i0;0r0n1n0r1`2i2k2p222s1~2v0U2x040a0y0f0K0B0k0B0*0l1i1k0-2g0K0K0r0X2S1A2z0n1I0t1+2(2c2e2d1{0$2B1W0l0n2u2P1`1Q1S0^212=2@0n0B2{1`0k2X1I2$2(38152j1k2}2q310K190S1`0)1.2X0i0}030P0P0X320r1?300B0A0V0R3z120y0V1A0)393c133b2A3e223g3i3k3m0r3o013q3s3u3w2^3z3B2n040y0#3G3I2k3K2$2;013P0)3j1I3l0o3n3p3r3t0-3Z313#0A0w3D0w3+2#3J143/3N0}3=3@053_3{3V3}3Y2?3!3A0A0J3D0J471B493L3d1U3O0B3h3?3R3`3T3|3X3 4m414o0g3D0g4t384a3c3:4e4D4i3W3~3v4J3y4o0j3D0j4P4v4b4y4d4A3Q3^3S3U4X4l3x420q3D0q4*3-4R3M4-3;4/4C4;4E4?4k4I4_4o0R3D0R4~2%504x2~534B4f4h4F4j4H4Z5b3B0N3D0N5g3.4S4c5l4:4g4=4G4Y404#3B0V0L125L5y5i4T545n5F5q5H4!420V0V5N3F0t3H484 4w5R5m4V5p4@5a4n5K3%0V3*5%3,5h5+5B4U564W595s5=3z44040V465`5)2%1L361A2{2+0$2e2:5B4Y2`1R1I350r373J6b1I4Y6s2A0l0$0}3r2$5Y3R6z6B5r5I6E0y2F0r6H5W5t3C2(5(4,5k0n123t0n0(2u0T6u0y5}520B120e6%6)5k0*3%016?6u144u3-5+6G016C3c423%5E6}626J4o2n6L2w6O4^64726a6U2q6;120U0B0 0i0x0+0B0T0K0x0n170r2M0x7k0l1z6`5|7C6x1k740P6D4o66736A6~6I5X7K2o6M7b5;4K3B7L7f5A527i040H7q0K0y2U0S002k0x1Q190n0X0o0r0x0V7o2k0F0l7w6^6u6|7N6 2k424q4;7H6P644q792G7U637W4p1`7Z516:3%0G0T0n1Q7+1 0f0Z1w1y0x1g8r0l7`0L0x0)0F0K0;817E836H7J3B4M89847P6Q4M8e6N7O8b8i8Q477g227$0!0m6!7+0T0y2c8G0:0S8z8q1Q7`7y0:8K3a3/7H8O0A4%8R8g763B4%8W957Q978k6T7!8n120v0l2Z0B0l2X3E0N0J0g8@8B0x0R8{0l8}6t8 8S914{948Y7c8i4{999F7V5J0A9D8$9f7h3%0I0*0X2u2Q1j7o0r0T8_3A9w9y6{9A8N705c6F8S8Z9M5d9J759b0A5d6S7F3:8)8+1 0b0)2S3?7_0F2u0$2X9$0J7o0T0;1~0(9)6c9+7O915v9E9^6Q5v9@8T64an9P8m9R129T0*0B1o2S8{0K9$9r0)0B0Cah7E6_8~4S909-5K5Maoat8i5L7S7a9K8h9MaY9|6/ay040Q7q0{0:6Z7y7w0Xaa8C7{31a70U0z2Xai9}aR864o5Z9/9a6Qb5as9;5Y5!a)8%0}7$0I3h7A0 9V9o9%0*2w9$a`0Ba|a~0rb08MalaS3z723l8a9Ga%787Ta#96bB9d9}5B7$0b0B0D8?8A8_0#9r0$0c9Va}a aN82ak850n5Y7LbD9:bFb,aZ8fbJ9_68bMa*8(6=6@b%8L0t6w6d6r6f6o1A0(6ic72.2)0)1}c40t6g1GbN522X0U0P0i0)0O0r0P0o661s1u8x0?0E821N3K1H0uaC2G0y2?1Q1w0c7+2k0?7-0c317?0c0x0y7-4Aa91 0-0?c!a@106!7r0?0n7.0y2jc#000l1o4A0/7?0r0Y0y0p0S0yco1h0y2Q1o1~2G6Z0y8+9n3t0o0c2Xd7czcB1P1R3:1X1Z1#1%1)1+1-241=1@1_cj5k2D2u2w120f1*1,0n826q7F5{6v3ub19B9-0N6R7Mb74ndP5!bab:0VdU2o575GdXdZbe9Q3O6X1j6!7u6.bf016+046-7E6(d;7$6?01bxb)7IdO0AbCcHb/9L3zdPbHa!apdTe3d!61aW4#e9b`d{3%7u2G7x7z0*7y7l0l7n7p7rd aQdNb3dPb-e5dS4KeCb=8XeceG43ef5/eKeieMd)axb|5N7|0n7~7w0x7(7r8tcV7.0n7:c=2k7@bwb aP6yeAb+dY8jaVbbe^8dbIePe88j5U5:a$f088aw5ja+5L8F8H0;0x8p8Be%8vcx9s1Qeye=9,eB0A8#b.eFeQ8Ve~ehf08Vd#5Vd%fqekd*bg5@9w0x8*8,0$8.8:0F8=fk9xe:9zezfoe@dP93dRb@5bfYeIftf098fAf376f%eSf8eU049v198C9i9k9m1 dY9qfRfm7Ge?f09Ofsf#ed9Ifwe{dP9If,e e^9O8lf;fG5Nf@0:0x9T9V0n9Xe*0+9!flfT9*fVbzfp9{f!gfdP9?gafC9?gefxe^gCgi9~5@ac0+ae0SagfJa00ya2a41~0xa78ra^g1eEgAfX0Aavg6gEg.f(g7eLargKgbg=f:gP5NaIaK0(go0{aC0kaE1ugw4Qb(gzb*f0a(gDgLdU5MdWe7e^aYf2g;hfgObOfHa{1tbv0xa-0Ta/2?h2eoa@0rh94v8Le07JdUbdhgg{b9gHhlhLeN58hh3zhMhr7#5@bsbu2Xgobj0*blf}0NbobqfShahIhce1fp5^b6g@eQh_hkf4hm78g`fCh_g}hs12bW7:bZhvh%bQbSg0gxajh?hK65h`hp44h~f.ikhohVb_i5hZ12d}bxc1dLc32(ch6f0.8=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

.128013éS=èP)5(Ogf6pinhI7eq/]3, b-o:vA4r[0y9k_T8lum1;c.2dRwtasj050Y0t0#0$0o0Q0%0z0V0Q0$0%0%0d010#0o0n010406050%0R0S0S0$0H0K040c0C0Q0R0|0C0p0z020$0S0n0U0z0Z0t160H0u0R0t0%050v13151719110n04051E1x1H0v1E110Y0o0E0;0?0^0`0?0p0k0R0$0k0t0B0n0K0#0q1g0z0q0o0k0q0Q1-0q0#0 050,0A0Q0t1Q0@0_011,1.1:1.0#1_1{1@0#0H1F1(0;1c0%0n0$0p0`0X011}1S010l0.0t0p1k0t1@2f2h2m1 2p1{2s0S2u040a0z0f0H0C0n0C0%0o1f1h0*2d0H0H0t0V2P1x2w0p1F0v1(2#292b2a1^0Y2y1T0o0p2r2M1@1N1P0=1~2/2;0p0C2^1@0n2U1F2Z2#35122g1h2`2n2~0H160Q1@0$1+2U0l0`030N0N0V2 0t1:2}0C0B0x0T0B0T0 0z0T1x0$363910382x3b1 3d3f3h3j0t3l013n3p3r3t2=3w3y2k040z0X3E3G2h3I2Z2.013N0$3g1F3i0q3k3m3o3q0*3X2~3Z3w3B0x3)2Y3H113-3L0`3:3=053@3_3T3{3W2:3Y3x0B0G3B0G441y463J3a1R3M0C3e3;3P3^3R3`3V3}4j3 4l0h3B0h4q3547393.4b4A4f3U3|3s4G3v4l0m3B0m4M4s484v4a4x3O3?3Q3S4U4i3u400s3B0s4%3+4O3K4*3/4,4z4.4B4:4h4F4?4l0P3B0P4{2!4}4u2{504y4c4e4C4g4E4W583y0L3B0L5d3,4P495i4-4d4/4D4V3~4Y3y0T0J0 5I5v5f4Q515k5C5n5E4X400T3A045W5M4t5O5j4S5m4;574k5H3#0T3(0v3F454|5#5y4R534T565p5,3z0x5K435;3*5e5^4 5`5B545D4=5 0T4n5Y4p645?664)5h695l555o5F5V4J5Y4L6j4r3+1I331x2^2(0Y2b2-5y4V2@1O1F320t343H6k1F4V6P2x0o0Y0`3o2Z5V3P6W6Y6r5U4l3A0z2C0t6(5T5q3z1@6j6m2n0V5X030z0r1l4x0#6R116y2!5#6%016Z39403#5B785}6s4l2k6-2t6:6d4H3!6@5=6_3M0 0#1q0n0t0H0$0#0R2U1w753$675h0C0 0d6R0z7H2n0~040I0w736R776X790N6!4l614.7f6)6=617k2D7m5+7o412#7r5x4 0M0 0!2O0q7M7O3M0A0 2K2r7V7s0`7Q0i857@6n0 2A0t8a4~7I7K8g5g2n0%3#0{7w7y7A7C1v0N0X0J8w0W0V0%0E018k3.7Q0y7~863/0 0S3r8E5y7J047L7F7 0`8n0 010H8D8T8J8G8I8b3c0 2r3|2:0k8O4 8Q8S378J8W04011e0l0B5a8:5h7Q0g8(8h2n7_040@948l7t042p0V1,7y907P0 0D7U8#4P7(7!3y6g7e7X7g6*9r2l6.7.5~7:9s640z9F7N8J0p8d0o9f0o9h9n951 8Q0W9i9c2U0$0Y3X9U870 0i937F748@9o9u7Z7b4I6$9-6;5 4J7,6/7Y9?7:6u3)9G9H8)1 970l4x9a4Q0 232;a78P0!0 2:ac689K9M9O9+9Q9#049l9)8E9p9/3y4!7%9=7n5G0B4!9_9A7hav7q3$a09G8U8K04aa0t0N322K2Uah8i8RaU8*aN1-ab9P9b0`9S9!aM0%290}a*889(4Nas9-9q0B4^axaE9wa_9y7l9{az4@aHaJaK9I0 0E3;0t7C7E35a1an018=aX9caOaQ2J6Na*a)a$a8042f1:72br5y88a*8_010y8!ama%01929mbF0zat2h405aa{b17/aA5aaDbR9BbTb4b5bfbG9J047v1l8r7B7Dbp0 9Tbxai980n7x0p0Ya/9$a*b%b91{bcb{04a;4sbrbM0p405sbQ9v6=5sbVcc5 ca3)9*6Q3-c75V5Jcb7)6e5Jcfcr7:5IaHaL6{0 6}0O0K2g1ZbJcl9,6(a^5W9;a|6=cMcu9|aAcM7=6UbGa4a67Fb#bs2r290t8fc!aL0Cae04agc+b7b(8q7zb,1vc2aqa=c6a@au3z7d3i7(cS5V7j9zbWaFd1bZ9FaLb%c%2Uc*bKby0 0Ia*0S0o5Kc27Tc;a2a(8jdtbg0p81c/0pbwdj4 bzb;8c04dgc)c2dmdH2ndodqdO1 7Q0wc45@c~cKd00T7$9tcO6e7+d8cgcwd$9Eb6duaMdKdicIbg7QdNdE5hdQ0463d|9j04dsbec,dwe59IdA0l0Q0C7Ac289dS4a8+dCdhdMdndpd drdW66dY7YcL9sd3aybS5V4ncRb26+9D3Fa0deejc(d@6z8$dlen0 6ie1dT0 e43Hc#8Pe7eWdeeaeceeehbHb|e)dfekdLe)d`eP04eRd^bGdUer3Iet7abN6+9~exd(cw9^d+cvcT9~d/ddc=d?eme)d~6weSaoeV3+eX8;eZfle#8de%dDe^8Fe+fid=e.eL76eN7Re=fhfudke3e{ck6z0v6T6A6O6C6L1x0#6FfS2+2$0$1`fP0v6D1DcW3.2U0S0N0l0$0MaP0q7$1p1r1t1v0zc|6Q1K3I1E0j1h7x1e0z0$0R0^0o0z0#cE7y0z1{0:0Y1g0p0bf_0Y0e0:0Q000o700H0,2Pf`1I3I2^3.1U1W1Y1!1$1(1*211/1;1?f(5y8e6.0 0f1%1)0p7V6NcW656S3rf(cn0x0X6?cqd5g$6?eCezg+6,6b5SeDg%5X44c=b)7xc^8tbde!8Jbidxe_dlfkesbKg#g%d2bLeybX3whaa 7-d96*hg5R5*heg+7d6^d;977{1(bj4adA83gTe:fwfGb=8eb.aWe)bBg{b+g~8v8x0J8z8BbEhD910 8Hh3bs8M0*hG8?hT8m8o8Zc2hWe8d;e-8-1Vh#bA8o8|8~hSeMd;bIhX5y9799h~hE9L9g0Hc{cHh{6Vc e g%d$f2hj58idhh9`d,4Yiihmilhf7;9 d:dyaji5hGb:fxb%9W9Y4jeffJa?dZic4mcNig4kg%eBf6g*iN2lg;hn7hiRcVeH8JcYi6i2dIaOhwbhc.c:h-iu9di49Ni#fx7Qf{dXh8ibc8g+f1hcf3im0Bf5b0ipi}iS5|f7iqf9eGb!eIaZ0k2;bmaSfA7Gh1fo2!fmi%a!jke604iyh%9ca,0Ha.hB049%i8fBcJeu9/g%awd%iL4HjJijj0iqaCiTj5jOiXjdc=b bb0Hg fpjmhHi-b$a9jrjiboe)bqiz0 bu2Oefh?8XbDc2iFe}9.iIa`jLjUa~g-hog%4^ioj9g+k2faaJcz6|0zcDcFjkfKjFiaiHi|g%bPk3kbkrjPjMj1bUjTkuh_jWb5jejZc1jBd{jw0`d~3DjBh6jld;h2j*4QdA2:fti9h4jCb}b8bakHi?eOffeokNk)fIjEg!i{iqciifk4ceiPg?0BcekAiQk}dckfiZ8dcZkT5_afb_9Ljkjp2nc-l9i)e;k+0 e0kKe*04h,h0d;d~e@kYfvloi)fgdri^h7fuh93zcpktl0cxk6iVlEj75)k4cxkDb!fbh.k$c0j#fej=dB1N0VjsfCkPld9RjnkQdye$edkXknkZeglYkGlWkIk#lZlbeqk:7WkpiqcUlGk|cQk{g.g@g:j8lHg^keiYd;cA046}0F0(0Cg32R0?6-mm0E3s1{gdjrl cmk=g/hbd4m5d7j4kB5/lM6qlHhqjckEg`c@8sb-j:b/l{0$b@2rb`jBl?lmb~k%l_k.j~37fMgZfO2#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