[DÉBUTANT] Explication csv

Fermé
MisterZ - 8 mars 2023 à 07:30
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 9 mars 2023 à 15:02

Bonjour,

J'aimerais beaucoup que quelqu'un m'explique ce code relativement simple mais je n'y arrive pas :/

Merci d'avance 
Android / Chrome 110.0.0.0

2 réponses

Utilisateur anonyme
8 mars 2023 à 08:10

Bonjour 

pour poster ton code, il faut faire comme décrit là https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code

De plus pour que l'explication soit complète, il faudrait qu'on puisse voir comment sont remplis masse et force. Là on ne peut faire que supposer, au risque de se tromper et de mal t'expliquer.

Même si avec ton titre, on imagine que ça vient d'un csv....


0
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812
8 mars 2023 à 10:57

Bonjour

Section de code #1

masse semble être une liste de dictionnaire dont la clé "mass" stocke la masse d'une planète. La structure masse est donc probablement mal nommée, un nom comme planetes aurait sans doute été plus approprié (et du coup, on renommerait i en planete). Cette section de code itère sur ces valeurs et les stocke dans la liste mass_de_planete.

Section de code #2

On crée ici un dictionnaire gravite dont la clé est le nom du planète et dont la valeur est la gravité. Puis on affiche ce dictionnaire.

Pour aller plus loin

Voici comment j'écrirais le programme.

import csv
from pprint import pprint

def load_csv(filename_csv: str):
    keys = list()
    rows = list()
    with open("planetes.csv") as f_csv:
        csv_reader = csv.reader(f_csv, delimiter=";")
        for (i, row) in enumerate(csv_reader):
            if i == 0:
                keys = [
                    key.split("/")[0].split("(")[0].rstrip()
                    for key in row
                ]
            else:
                rows.append([
                    value.split("/")[0].rstrip()
                    for value in row
                ])
    planetes = [
        {
            key : value
            for (key, value) in zip(keys, row)
        }
        for row in rows
    ]   
    return planetes 
                
# https://www.datastro.eu/api/explore/v2.1/catalog/datasets/donnees-systeme-solaire-solar-system-data/exports/csv?lang=fr&timezone=Europe%2FBerlin&use_labels=true&delimiter=%3B
planetes = load_csv("planetes.csv")
pprint(planetes)    

#1
masses = [
    planete["Mass"]
    for planete in planetes
]
pprint(masses)

#2
gravites = {
    planete["Planet"] : planete["Gravity"]
    for planete in planetes
}                      
pprint(gravites)

Quelques explications :

  • Pour les sections de code #1 et #2, voir ce que j'ai expliqué ci-dessus. La seule nuance, c'est que j'utilise une syntaxe plus compacte et plus performante (on parle de liste de compréhension et de dictionnaire de compréhension). C'est une manière de construire un dictionnaire / une liste en une instruction.
  • Dans load_csv, je charge le fichier csv (téléchargé depuis l'URL indiqué dans le code et supposé stocké dans le fichier "planetes.csv" dans le même dossier que le script python)
    • J'ouvre le fichier en lecture avec un context manager
    • Je stocke son contenu au module csv.
    • La première ligne est stockée dans la liste keys (i == 0)
    • Les lignes suivantes sont stockées dans la liste rows (i > 0)
  • Si tu regardes le fichier csv en question, tu verras qu'il comporte du texte en anglais et en français (respectivement à gauche et à droite du caractère /). C'est pourquoi j'utilise split pour séparer le texte sur /. Ensuite on prend soit le bout de gauche [0] (anglais) soit le bout de droite [1].
  • Une fois ce bout extrait, il peut arriver que l'unité de mesure soit présente, entre parenthèses. Donc sur le même principe, j'extrais ce qui est à gauche de la parenthèse avec split("(")[0].
  • Enfin comme il reste des espaces en fin de chaînes, je les supprimes avec rstrip().
  • À la fin du with, je réunis les données stockées dans headers et rows pour former planetes. C'est une liste de dictionnaire (un par planète). Chaque dictionnaire à pour clés les valeurs de headers. Pour chaque planète, on associe à chaque clé de son dictionnaire la valeur correspondante (récupérées depuis values). Pour itérer simultanément sur le k-ème élément de headers et la k-ème valeur de la ligne courante (row) j'utilise zip. Ainsi je garantis que chaque clé est associée à la valeur qui lui correspond.

Bonne chance

0

Merci énormément pour ta réponse.

Le temps que tu a consacré me fait extrêmement plaisir et me motive pour apprendre, merci encore vous êtes incroyable :D 

(Pour le contexte, je suis en spé NSI 1ere , j'ai beaucoup mieux compris :) aussi notre prof est vraiment pas pédagogue et ne répond pas vraiment au questions )

0
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 7 812 > MisterZ
9 mars 2023 à 15:02

Hé bien merci pour cette réponse très chaleureuse, c'est typiquement le genre de message qui nous pousse à aider des inconnu.e.s. Je souhaite beaucoup de réussite dans ton cursus.

Est-ce que tu as les réponses à toutes tes questions (concernant la question initiale) ?

0