Aller au contenu

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 +

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 :

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 :

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,]a/cP_Ai;y(I25qe78jOpv1)0f:gS.39moérhdèwtsRl4-k [n6=uTb050N0r0Q0d0j0T0R0X0f0T0d0R0R0#010Q0j0w010406050R0$0I0I0d0L0l040E0J0T0$0|0J0Z0X020d0I0w0k0X0S0r160L0q0$0r0R050e13151719110w041x1E051H0e1H1J1E110N0j0x0;0?0^0`0M0j0D0M0T1X0M0Q0 050,0(0T0r1S0@0_011W1Y1!1Y0Q1*1,1(0Q0(0J0N191)0L1F0Q0M0;1c0R0w0d0Z0`0o011.1U010B0.0r0Z1k0r1(292b2g1:2j1,2m0I2o040a0X0g0L0J0w0J0R0j1f1h0*270L0L0r0f2J1x2q0Z1F0e252V0Q2322240N2s0`1!0Z2l2G1(1P1R0=1/2)0j2+0Z1 1Q1(0w2O1F2T2V30122a1h2;2h2_0L160T0 0X0y2S3410332r361:383a3c0o3f2b3h2T2(013m0d3b040X0G3q2U113t3k0`3w3y0X0U3C3s343u3I3c0p3M3E3O3G3v0J393x3c0!3T3i351T3l3Y3n3z0s3%3F3*3H3,3!3z0t3:3V3=3X3Z3J0H3{3j3}3Q040y0A423)2=3~3-0y3e1y3g3U434b450y3p4g3r4i4a373@3y0y3B4o3D3(3P4t0 0y3L4x3N4j4s3 4C3S4F1G2~1x2/2Y0N2$3u0f1 2y0)1Q1F2}0r2 3g3M054V0*4%4H1:0f0y0 030X0n1l3Y0Q493P0 0Q1q0w0r0L0d0Q0$2O1w4F0X4z3W0J0 0#3M5a3;4b0~040Y0c4|3W0W0 0P2I0M5g5b440(0 2E2l4)5i2h5k0m5C3|4k0 2u0r5H4.0`5d045f4M5D1:0R2e040{505254561v0h0o0A5*0F0f0R0x015N4r1:5k0b5v5U3H0 0I4W5=3u5Q5S325{015W0 010L5;5T5I5E0 5_595w5J042l4+2@0D605c5e6p3}675Y1e0B0V0t6b646d5@0 0z5`6C0`5q040@6G5O3v5K0j0f1W526s5j0 0C3T0X6Z5h6H6O042j6R0j6T6c6N5Q0F6U370 2O0d0N2*5M6-5?0`5F6F4F066!6#6N6J0B3Y6M6}6%1@2+79610P0 2@7e3W0Z6P6*6,6B6N5k6X7173736i6=047c0r0h2}2E2O7j3}627F6j7z6;1:6/7L5|040R2Z0}7O016 6Y7u6Z7w3l0 0x3x0r565830747a7H6h657l7y1X2+7B2D4#7U7N6|4}7Q0w1!4{7~3W5F7U6u010b6A4(655k7030727Y7-7 4 1l5#55577|0 6:84440 0d0w510Z0N7U868t6j7%1,7*8B6E3T4q4U4;044?0%0l2a0D6{8g7!6I5K787:6$7=2l2Z0r8U3g8j5c7g047i8!6N7=8l51538o1v8I047s8g7v7;0 8%2O8*3r8W7V0 0Y7U0I0j4C8|5n8;7.6r9h3P5y8/0Z837p7a8C9q7 938)8|9a8D2h9c9e9z6D040c8f4h908#929o949x9b9d044w9t850 9g7,977/9X7;9m0B0T0J548|5G9D7P9v952U975k9y9T3}9B9R9f9H4p9J8=9L8(9:4-9r999P0 4E9^6V9F7I2h9Z8+970Z9$9(9*9-98049,aa7x9/9Oam9`a98c6$5k9G7X7Z916k9M9wam9?a7044Laq9E9Wag65af3r8,5x5Kak9pax7q0 apaY7a8$aFa39=a6au9QaLa$3uaz9}4y0e4+4$4Na`0e4Q1x0Q4Sa 2!2W1~202Y0d1+a|4Q1Da43u2O0I0h0B0d0W7A0M0G0 1p1r1t1v0X8~4(1K3h1E0v1h511e0X0d0$0^0j0X0Q8R520X1,0:0N1g0Z0Kbs0N0O0:0T000j4_0L0,2Jbt1G3h2/3u1=1Z1#1%4!4O324Ma_bd7k4~5!8_5%7+aP6$aR2UaTab5m5o3}6J5s25ad3l9m5A0Z9+7U7=5L8q5R875X5Z8mb}575)5+0A5-5/8b968d6fcc7P5~0*cl63a:3W886a8|6g9!9KaE6m0Z6oamc2b_6tco6w6ycy9;cA04a?3z976J6L9kb`6(6Q6S0L8|bu9~6!ah7mc=cl8saM7P6@6_2@a*c%0mc)8haC6$768ZcOa07?0D7dc.7G8.8:dea%c|6+c?aH6WaB7uc{dg7^7C7{dj4bcVc47x7KcU8rci0 7R0L7Tdsaod88idE7#048F7)0Lb aS9Y9jdn7 7z7_7Dd5c1dIam7=2982cham888a8|dQ8i974:4=0X8Q8Sa3d9dvaDdV8HdO9@cI9_9Q4fd0anaOdZaQd#c08=9m2@aXczaya!dJdU7(e7eeaIa-9Cew9Vd`7Yc+8Ydrd$c/2@1P0fa3dS5PdlcgdB6e5laJ9SeaabcNek7aavcMcC019`a/epaZ9Fc^3DdR9 doet8GdXatee7=eJ6Qd+e,egc3d!cmeRcdaV9)eoc$eqaoese6e^e8ese|eL9|due;8Md~0i0u0JbC2L0?0X2_0$0x0r0T1,bM7@e2dRdw8@8nb~c~es8w8y8AdOa#e+e=fddYf9e,d81xb^a{2Vbb4P0+0-0/04.