Partage
  • Partager sur Facebook
  • Partager sur Twitter

Execrice - Apprenez les bases du python

Chargez des données Python

    26 octobre 2021 à 12:57:17

    Bonjour,

    Je n’arrive pas à terminer l’exercice de la partie. J’ai l’impression qu’il manque des éléments dans le cours pour nous permettre de réussir l’exercice pratique. Quelqu’un a la solution ?

    Ici est le code que j’ai pondu :

    import csv 

    # Ecrivez le code ci-dessous. Utilisez le package csv ! en_tête = ["nom", "salaire"] with open('output.csv', 'w') as fichier1: writer = csv.writer(fichier1, delimiter=',') #là j’arrive à faire le nouveau fichier output.csv, et de créer l’entête qu’il faut writer.writerow(en_tête) with open('input.csv', 'r') as fichier: reader = csv.reader(fichier, delimiter=',') #ici je ne sais pas quoi faire de plus pour: #1. Récupérer la deuxième colonne de input.csv et de faire heure_de_travail * 15 #2. Écrire ces nouvelles données dans le fichier output.csv

    Merci d’avance pour vos réponses !

    -
    Edité par LouisVIGNERAS 26 octobre 2021 à 13:17:10

    • Partager sur Facebook
    • Partager sur Twitter
      26 octobre 2021 à 15:22:59

      faut ptet lire le input avant d'écrire le output :-°
      • Partager sur Facebook
      • Partager sur Twitter
        26 octobre 2021 à 16:12:01

        lire le fichier input et le récupérer comme un dictionnaire, et ensuite tu écris ligne par ligne en utilisant le dictionnaire récupéré
        • Partager sur Facebook
        • Partager sur Twitter
          26 octobre 2021 à 23:38:55


          umfred a écrit:

          lire le fichier input et le récupérer comme un dictionnaire, et ensuite tu écris ligne par ligne en utilisant le dictionnaire récupéré



          Effectivement, c’est donc ce que j’ai fait, mais alors pour une raison inconnue, ma boucle *for* ne s’exécute qu’une seule fois.

           Mon code:

             
          import csv
              
              # Ecrivez le code ci-dessous. Utilisez le package csv !
              en_tete = ["nom", "salaire"]
              
              with open('input.csv', 'r') as fichier:
                  reader = csv.DictReader(fichier, delimiter=',')
                  for ligne in reader:
                      with open('output.csv', 'w') as fichier1:
                          writer = csv.writer(fichier1, delimiter=',')
                          writer.writerow(en_tete)
                          writer.writerow(ligne)



          À cela se rajoute deux difficultés :

          1. Comment faire heure_travaillees * 15 seulement dans la seconde colonne comment faire la multiplication seulement dans la deuxième colonne ?

          2. Comment ne pas lire la première ligne de input.csv étant donné que je la remplace avec en_tete ?



          -
          Edité par LouisVIGNERAS 26 octobre 2021 à 23:50:35

          • Partager sur Facebook
          • Partager sur Twitter
            27 octobre 2021 à 11:25:20

            dans ta boucle for à chaque open tu écrase le fichier puis tu écrit l'entete + une ligne

            Tu dois ouvrir les deux fichiers en même temps :

            with open('input.csv', 'r') as infile, open('output.csv', 'w') as oufile:

            et aussi c'est mieux d'utiliser DictWriter

            -
            Edité par thelinekioubeur 27 octobre 2021 à 11:28:09

            • Partager sur Facebook
            • Partager sur Twitter
              27 octobre 2021 à 12:41:31

              ou ouvrir le fichier input, lire les données (puis fermer le fichier) puis ouvrir le fichier output (en écriture) et y écrire tes données à l'aide des données récupérées

              Pour ta question 2, regarde la doc de csv et du Dictreader (en particulier, l'explication du paramètre fieldnames)

              pour ta question 1, pareil regarde dans la doc de csv et les exemples de writer ou DictWriter

              https://docs.python.org/fr/3/library/csv.html 

              -
              Edité par umfred 27 octobre 2021 à 15:06:58

              • Partager sur Facebook
              • Partager sur Twitter
                27 octobre 2021 à 12:57:57

                Merci pour ces détails, je me rapproche doucement du résultat demandé.

                Voilà le code que j’ai:

                import csv
                
                # Ecrivez le code ci-dessous. Utilisez le package csv !
                en_tete = ["nom", "salaire"]
                
                
                with open('input.csv', 'r') as infile, open('output.csv', 'w') as outfile:
                    reader = csv.reader(infile, delimiter=',')
                    writer = csv.writer(outfile, delimiter=',')
                    writer.writerow(en_tete)
                    for x in reader:
                        writer.writerow(x)

                Et j’obtiens ça dans output.csv:

                nom,salaire
                nom,heures_travaillees
                Pierre Durand,36
                Paul Dupont,41
                Edouard Gentil,40

                Les deux soucis qu’il me restent sont donc:

                1. Comment faire heure_travaillees * 15 seulement dans la seconde colonne comment faire la multiplication seulement dans la deuxième colonne ?
                2. Comment ne pas lire la première ligne de input.csv étant donné que je la remplace avec en_tete ?


                -
                Edité par LouisVIGNERAS 27 octobre 2021 à 13:48:08

                • Partager sur Facebook
                • Partager sur Twitter
                  27 octobre 2021 à 13:27:34

                  x repetita DictReader => dictionnaire => permet accès aux champs par leur entête (cf le cours + la doc) => permet de faire des calculs sur la valeur du champ
                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 octobre 2021 à 13:44:56

                    umfred a écrit:

                    x repetita DictReader => dictionnaire => permet accès aux champs par leur entête (cf le cours + la doc) => permet de faire des calculs sur la valeur du champ

                    Bon je suis désolé, mais vraiment je ne comprends rien, j’essaie plusieurs choses différentes depuis hier, je regarde la doc, mais rien n’y fait je n’y arrive pas. Ce serait plus simple s’il y avait la correction pour que je puisse comprendre avec les lignes de codes directement.

                    Tu ne veux pas poster la solution plutôt ?



                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 octobre 2021 à 15:07:01

                      Voila le code que j'ai mis
                      import csv
                      
                      with open("input.csv") as input_file, open("output.csv","w") as output_file:
                          dr_input=csv.DictReader(input_file,delimiter=',')
                      
                          w_output=csv.writer(output_file,delimiter=',') 
                          w_output.writerow(["nom","salaire"])
                          for ligne in dr_input:
                              w_output.writerow([ligne["nom"],int(ligne["heures_travaillees"])*15])
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 novembre 2021 à 22:44:42

                        Bonjour,

                        Pour faire suite au message de @thelinekioubeur, j'ai essayé d'utiliser la fonction DictWriter(), je n'arrive pas à relier les en-têtes aux contenus et sur la documentation python il est indiqué(/présenté) d'utiliser writer.writerow() et de faire les "connexions" manuellement, d'ailleurs j'ai du mal à comprendre l'intérêt de cette fonction si c'est le cas.

                        import csv
                        
                        with open("input.csv") as infile, open("output.csv","w") as outfile:
                            reader=csv.DictReader(infile,delimiter=',')
                            en_tete = ["nom","salaire"]
                            writer=csv.DictWriter(outfile, fieldnames=en_tete, delimiter=',')
                            writer.writeheader()
                            #for ligne in reader:
                            #    writer.writerow([ligne["nom"],int(ligne["heures_travaillees"])*15])
                        



                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 novembre 2021 à 19:00:14 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


                            16 avril 2022 à 17:43:02 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


                            Execrice - Apprenez les bases du python

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown