Partage
  • Partager sur Facebook
  • Partager sur Twitter

Python créer csv à partir d'un autre csv importé

cours apprenez les bases du langage python

Sujet résolu
    9 août 2021 à 0:55:10

    Bonjour,

    Je poursuis mon apprentissage du langage Python mais ce n'est pas encore gagné...o_O

    Je bute sur un exercice où je dois importer un fichier heures.csv

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

    à partir duquel je dois créer un nouveau salaire.csv qui permet d'obtenir le résultat des heures_travaillees * 15 qui donnerait

    nom,salaire
    Pierre Durand,540
    Paul Dupont,615
    Edouard Gentil,600

    je n'arrive pas à consolider mon code Python pour faire ces deux actions. d'un coté j'arrive à importer le fichier mais je n'arrive pas à le modifier et d'un autre coté j'arrive à créer le nouveau csv si je définis manuellement les en-ente, lignes et calcul à faire pour chaque ligne.

    Comment faire pour générer un code qui puisse me permettre de réaliser cet ensemble et simplement ?

    Merci pour votre assistance

    • Partager sur Facebook
    • Partager sur Twitter
      9 août 2021 à 1:25:06

      Est-ce que tu lis tes entrées en format de listes de chaînes de caractères ou sous forme de dictionnaire?
      Si tu réussis à lire correctement le fichier d'enrtrée et si tu réussis à écrire le fichier de sortie, tu devrais pouvoir le faire
      Disons que les entrées sont dans row1 et les sorties seront dans row2.
      Tu pourrais faire:
      row2[1] = str(int(row1[1] * salaire_horaire))
      N'oublie pas que les valeurs sont en caractères (str) et doivent être reconverties en caractères.
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        9 août 2021 à 3:45:30

        Je suis complément perdue : à force de tenter une multitude de code je ne parviens plus à obtenir la sortie :'(
        • Partager sur Facebook
        • Partager sur Twitter
          9 août 2021 à 4:25:24

          Comment lis-tu ton fichier csv?
          Tu devrais avoir les fonctions complémentaires pour créer le fichier de sortie.
          Pour éviter des problèmes, n'essaies pas de réécrire sur le même fichier pour commencer.
          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

          Anonyme
            9 août 2021 à 4:25:28

            Salut,

            Voilà qui pourra t'aider, je te laisse un peu de boulot, la modification de l'entête "heures travaillées" et la sauvegarde ;)

            import csv
            
            def modify_csv(file_csv):
                taux_horaire = 15
                with open(file_csv) as csvfile:
                    dict_reader = csv.DictReader(csvfile)
                    for row in dict_reader:
                        salaire = int(row["heures_travaillees"]) * taux_horaire
                        row["heures_travaillees"] = str(salaire)
                        print(row["nom"], row["heures_travaillees"])
            
            modify_csv("heures.csv")


            Allez, il y a surement plus simple notamment avec Panda:

            import csv
            
            def modify_csv(file_in, file_out):
                taux_horaire = 15
                fieldnames = ['nom', 'salaire']
            
                with open(file_in) as csvfile_in,  open(file_out, 'w') as csvfile_out:
                    dict_reader = csv.DictReader(csvfile_in)
                    dict_writer = csv.DictWriter(csvfile_out, fieldnames=fieldnames)
                    dict_writer.writeheader()
            
                    for row in dict_reader:
                        salaire = int(row["heures_travaillees"]) * taux_horaire
                        dict_writer.writerow({fieldnames[0]: row["nom"], fieldnames[1]: str(salaire)})
            
            modify_csv("heures.csv", "salaires.csv")



            -
            Edité par Anonyme 9 août 2021 à 5:51:11

            • Partager sur Facebook
            • Partager sur Twitter
              9 août 2021 à 7:01:57

              Ce qui peut mélanger est que les objets créés par csv.reader et csv.writer ne se comportent pas tout à fait de la même façon.
              L'objet créé par csv.reader est un générateur qqui nous fournit les informations quand on les demande dans un for par exemple.
              L'objet créé par csv.writer ressemble plus à une instance d'une classe qui reçoit les informations et les arrange correctement et les écrit sur le fichier     (à notre insue, je trouve).
              • Partager sur Facebook
              • Partager sur Twitter

              Le Tout est souvent plus grand que la somme de ses parties.

                10 août 2021 à 0:53:44

                Merci à vous deux pour votre assistance. J'ai compris pourquoi je bloquais car je m'étais mis en tête de créer une fonction pour extraire les données de heures.csv, puis une autre fonction pour faire le calcul des heures en salaire, et une dernière pour associer le tout et enregistrer.

                En reprenant le code de Diablo 76 (pour l'instant je n'ai pas encore vu panda je suis encore à l'apprentissage du langage de base), j'ai bien compris que l'on pouvait faire quasi tout avec une seule fonction :lol: (mais je n'arrive toujours pas à créer mon fichier de sortie)

                le code :

                import csv
                
                def modify_csv(file_csv):
                    taux_horaire = 15
                    with open(file_csv) as csvfile:
                        dict_reader = csv.DictReader(csvfile)
                        for row in dict_reader:
                            salaire = int(row["heures_travaillees"]) * taux_horaire
                            row["heures_travaillees"] = str(salaire)
                            out = (row["nom"], row["heures_travaillees"])
                            print (out)
                            en_tete = ["nom", "salaire"]
                            writer = csv.writer(open('salaire.csv','w'), delimiter=',')
                            writer.writerow(en_tete)
                            writer.writerow(out)
                modify_csv("heures.csv")

                me donne uniquement 1 ligne de résultat

                nom,salaire
                Edouard Gentil,600
                

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

                Je comprends parfaitement les formules mais j'ai du mal à les créer et encore plus à penser à le faire et correctement en prime. Avez-vous des recommandations pour que je m'entraine sur des cas très simples. Autant j'ai appris SQL aisément mais je n'arrive pas à passer au niveau supérieur avec Python : je comprends le principe mais impossible d'écrire un code correct et c'est pas faute de remplir des lignes et des lignes de brouillons d'essais de code différent en vain

                Merci bcp pour cette aide !!!
                • Partager sur Facebook
                • Partager sur Twitter
                  10 août 2021 à 1:13:51

                  Sur ta ligne 13, tu ouvres le fichier de sortie? Tu le fais pour chaque entrée, donc tu détruis ce qui a été fait précédemment.
                  Refait une autre boucle pour écrire après avoir fait les modifications.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                    10 août 2021 à 1:22:19

                    ah oui maintenant je me rappelle pourquoi j'ai pas fait ma boucle for car j'obtiens une erreur

                    TypeError: '_csv.writer' object is not iterable

                    il faudrait que j'utilise zip() mais je n'arrive pas à l'écrire correctement

                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 août 2021 à 1:43:13

                      Ramène les lignes 12 à 14 qui ouvrent la sortie et écrivent l'entète avant le  with  (et décale en 5).
                      Je l'ai testé et ça marche.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Le Tout est souvent plus grand que la somme de ses parties.

                        10 août 2021 à 2:00:28

                        Génial ! Merci

                        Comme quoi tout est possible, il faut juste bien positionner ses lignes de code :)

                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 août 2021 à 2:27:29

                          Le problème était que tu ouvrais le fichier d'entrée avec un with open et le fichier de sortie autrement.
                          En fait, c'était la chose à faire.
                          Chaque entrée (row) est un dictionnaire. Il n'y a pas un dictionnaire pour tout le fichier.
                          C'est en fait une liste de dictionnaires.
                          Si tu avais utilisé  csv.reader à la place, tu aurais une liste de listes.
                          L'avantage du dictionnaire est qu'on se rappelle plus facilement le nom de chaque champs que son numéro de position dans la ligne.
                          Et ces noms sont indiqués dans la ligne d'entête.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Le Tout est souvent plus grand que la somme de ses parties.

                          Anonyme
                            10 août 2021 à 8:11:51

                            @Aurélie M.

                            Rassure-toi, ce genre d’erreur ( et bien d’autres ) , on les a tous fait... ;)

                            Par contre mon 2ieme script n’utilise pas Panda même si mon commentaire porte à confusion.

                            On aurait très bien pu créer 3 fonctions comme tu voulais le faire, il faut juste savoir que l’objet dic_reader sorti du with générera une erreur 

                            I/Ø operation on closed file.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              10 août 2021 à 15:32:44

                              Diablo76 a écrit:

                              On aurait très bien pu créer 3 fonctions comme tu voulais le faire, il faut juste savoir que l’objet dic_reader sorti du with générera une erreur 

                              I/Ø operation on closed file.


                              Salut Diablo 76

                              est-ce que je peux abuser pour te demander un exemple pour chacune des 3 fonctions, c'est finalement ça que je n'ai pas réussi à faire...

                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                10 août 2021 à 19:40:42

                                Alors, je n'ai rien optimisé, mais voilà ce que ça peut donner :

                                import csv
                                
                                
                                def open_csv(file_in):
                                    with open(file_in) as csvfile_in:
                                        list_csv = list(csv.DictReader(csvfile_in))
                                        return list_csv
                                
                                def modify_csv(list_csv):
                                    taux_horaire = 15
                                    for dic in list_csv:
                                        for key, value in list(dic.items()):
                                            if key == "heures_travaillees":
                                                dic["salaire"] = dic.pop("heures_travaillees")
                                                dic["salaire"] = int(value) * taux_horaire
                                    return list_csv
                                    
                                
                                def save_csv(list_csv, file_out):
                                    with open(file_out, 'w') as csvfile_out:
                                        fieldnames = ['nom', 'salaire']
                                        dict_writer = csv.DictWriter(csvfile_out, fieldnames=fieldnames)
                                        dict_writer.writeheader()
                                        for row in list_csv:
                                            dict_writer.writerow(row)
                                
                                
                                list_csv = open_csv("heures.csv")
                                list_modified = modify_csv(list_csv)
                                save_csv(list_modified, "salaires.csv")

                                Edit: Ah je n'avais pas compris que l'exo etait pour un cours, un autre membre a également posté ici

                                -
                                Edité par Anonyme 10 août 2021 à 20:11:15

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  9 mai 2023 à 16:09:11

                                  Merci pour votre aide.

                                  voila le code simplifié, le cast de la variable salaire n'est pas nécessaire :

                                  import csv
                                  def modify_csv(file_csv):
                                      taux_horaire = 15
                                      with open(file_csv) as csvfile:
                                          dict_reader = csv.DictReader(csvfile)
                                          en_tete = ["nom", "salaire"]
                                          writer = csv.writer(open('output.csv','w'), delimiter=',')
                                          writer.writerow(en_tete)
                                          for row in dict_reader:
                                              salaire = int(row["heures_travaillees"]) * taux_horaire
                                              #row["heures_travaillees"] = str(salaire)
                                              out = (row["nom"], salaire)
                                              print (out)
                                              writer.writerow(out)
                                  modify_csv('input.csv')

                                  -
                                  Edité par VincentGe 9 mai 2023 à 16:09:50

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Python créer csv à partir d'un autre csv importé

                                  × 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