Partage
  • Partager sur Facebook
  • Partager sur Twitter

exploiter un fichier csv en Python

    6 janvier 2022 à 2:18:39

    Bonjour je suis nouveau en python et également nouveau sur le forum.

    je dois mettre en place un script qui me permettrait de générer un fichier a partir de chaque ligne d'un fichier csv.
    j'ai réalise pas mal de recherche sur le net, et je ne trouve pas de solution à mon problème. C'est pourquoi je me permets de m'adresser à vous. Peut être que vous pourriez m'aider à trouver une solution.

    voici un extrait de mon fichier test.csv

    nom;session;critere1;critere2;critere3;critere4
    Nom1;test1;F;AETW01;1900;job1
    Nom2;test2;F;AETW02;1901;job2
    Nom3;test3;F;AETW03;1902;job3

    voici mon code :

    import csv
    
    def csvcount(filename):
        with open(filename, 'r') as file:
            i = 0
            for ligne in file:
                i += 1
            return i
    
    
    input_file = 'test.csv'
    output_file = 'result.csv'
    
    with open(input_file, newline='') as f, open(output_file, 'w') as result:
        read = csv.reader(f, delimiter=';')
        writer = csv.writer(result, lineterminator="\n", delimiter=";")
        boucle = 0
        for row in read:
            boucle += 1
            if boucle < csvcount(input_file):
                writer.writerow(row)  # je dois a terme génerer un fichier a partir d'une colonne du fichier csv
    
     

    voici un extrait du fichier result
    nom;session;critere1;critere2;critere3;critere4
    Nom1;test1;F;AETW01;1900;job1
    Nom2;test2;F;AETW02;1901;job2
    Nom3;test3;F;AETW03;1902;job3

    dans un premier temps avec le code ci dessus, je cherche a extraire uniquement une ligne dans un fichier. Mais a terme je voudrais 
    extraire chaque ligne dans un fichier respectif, dont le nom du fichier sera récupérer dans une colonne du fichier csv

    Merci d'avance pour votre aide.

    -
    Edité par YannC974 6 janvier 2022 à 8:37:58

    • Partager sur Facebook
    • Partager sur Twitter

    ​"Quand on ne peut pas changer le monde, il faut changer le décor."

    Il ne faut pas chercher à rajouter des années à sa vie, mais plutôt essayer de rajouter de la vie à ses années

      6 janvier 2022 à 3:16:30

      Bonjour,

      Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
      Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

      Pour plus d'informations, nous vous invitons à lire les règles générales du forum

      Merci de colorer votre code à l'aide du bouton Code

      Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: python;">Votre code ici</pre>.

      Merci de modifier votre message d'origine en fonction.

      Liens conseillés

      • Partager sur Facebook
      • Partager sur Twitter
        6 janvier 2022 à 5:09:52

        Au cas où tu n'aurais pas trouvé la documentation officielle.


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


        Pour chaque ligne de ton fichier csv, tu devras ouvrir un autre fichier correspondant au nom exttrait de la ligne et le lire.
        Ça pourrait se faire plus facilement et plus lisiblement dans une fonction.

        • Partager sur Facebook
        • Partager sur Twitter

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

          6 janvier 2022 à 8:39:40

          PierrotLeFou a écrit:

          Au cas où tu n'aurais pas trouvé la documentation officielle.


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


          Pour chaque ligne de ton fichier csv, tu devras ouvrir un autre fichier correspondant au nom exttrait de la ligne et le lire.
          Ça pourrait se faire plus facilement et plus lisiblement dans une fonction.


          Merci je vais explorer cette piste.
          • Partager sur Facebook
          • Partager sur Twitter

          ​"Quand on ne peut pas changer le monde, il faut changer le décor."

          Il ne faut pas chercher à rajouter des années à sa vie, mais plutôt essayer de rajouter de la vie à ses années

            6 janvier 2022 à 11:31:24

            tu arrives donc à bien copier les lignes. As-tu essayé de faire un print de row par hasard dans ta boucle (entre la ligne 18 et 19 par exemple
            • Partager sur Facebook
            • Partager sur Twitter
              6 janvier 2022 à 17:43:48

              umfred a écrit:

              tu arrives donc à bien copier les lignes. As-tu essayé de faire un print de row par hasard dans ta boucle (entre la ligne 18 et 19 par exemple


               Bonjour voici la réponse que j'obtiens en rajoutant le print(row) 

              with open(input_file, newline='') as f, open(output_file, 'w') as result:
                  read = csv.reader(f, delimiter=';')
                  writer = csv.writer(result, lineterminator="\n", delimiter=";")
                  boucle = 0
                  for row in read:
                      print(row)
                      boucle += 1
                      if boucle < csvcount(input_file):
                          writer.writerow(row)  # je dois a terme génerer un fichier a partir d'une colonne du fichier csv



              ['nom', 'session', 'critere1', 'critere2', 'critere3', 'critere4']
              ['Nom1', 'test1', 'F', 'AETW01', '1900', 'job1']
              ['Nom2', 'test2', 'F', 'AETW02', '1901', 'job2']
              ['Nom3', 'test3', 'F', 'AETW03', '1902', 'job3']
              ['Nom4', 'test4', 'F', 'AETW04', '1903', 'job4']
              ['Nom5', 'test5', 'F', 'AETW05', '1904', 'job5']
              ['Nom6', 'test6', 'F', 'AETW06', '1905', 'job6']
              ['Nom7', 'test7', 'F', 'AETW07', '1906', 'job7']
              ['Nom8', 'test8', 'F', 'AETW08', '1907', 'job8']
              ['Nom9', 'test9', 'F', 'AETW09', '1908', 'job9']


              Je voudrais qu'il crée un fichier par ligne

              -
              Edité par YannC974 6 janvier 2022 à 17:44:54

              • Partager sur Facebook
              • Partager sur Twitter

              ​"Quand on ne peut pas changer le monde, il faut changer le décor."

              Il ne faut pas chercher à rajouter des années à sa vie, mais plutôt essayer de rajouter de la vie à ses années

                6 janvier 2022 à 17:50:35

                tu déduis quoi du print(row) ? que à chaque fois, il contient les valeurs de chaque ligne.
                Du coup si tu veux écrire chaque ligne dans un fichier, il faut créer chacun des fichiers à chaque accès de ligne donc dans la boucle, et non pas avant comme tu le fais actuellement.

                Après, l'intérêt d'avoir une seule ligne dans un fichier est limitée je trouve.

                • Partager sur Facebook
                • Partager sur Twitter
                  6 janvier 2022 à 20:25:47

                  umfred a écrit:

                  tu déduis quoi du print(row) ? que à chaque fois, il contient les valeurs de chaque ligne.
                  Du coup si tu veux écrire chaque ligne dans un fichier, il faut créer chacun des fichiers à chaque accès de ligne donc dans la boucle, et non pas avant comme tu le fais actuellement.

                  Après, l'intérêt d'avoir une seule ligne dans un fichier est limitée je trouve.


                  En effet il rajout tout dans un fichier, ce qui est normale car pour le moment je ne l'ai pas encore intégré dans mon code. Une seule ligne c'est peut être limité, mais c'est justement cela mon besoin aujourd'hui. De me limiter l'importation de chaque ligne dans un fichier (de configuration).
                  par exemple un fichier s'appellera nom1, avec des paramètres dans ce fichier
                  - critère 1
                  - critère 2
                  - critère 3
                  - critère 4

                  j'ai essayé de rajouter l'écriture de fichier dans la boucle comme ceci :

                  with open(input_file, newline='') as f, open(output_file, 'w') as result:
                      read = csv.reader(f, delimiter=';')
                      boucle = 0
                      for row in read:
                          boucle += 1
                          if boucle < csvcount(input_file):
                              writer = csv.writer(result, lineterminator="\n", delimiter=";")
                              writer.writerow(row)

                  Mais cela ne change pas le problème, effet il doit tout mettre dans le même fichier, mais normalement avec "w", il ne devrait pas écraser a chaque fois le fichier et n'afficher que l'importation d'une ligne (c'est  à dire la dernière)? (si le code marche)

                  • Partager sur Facebook
                  • Partager sur Twitter

                  ​"Quand on ne peut pas changer le monde, il faut changer le décor."

                  Il ne faut pas chercher à rajouter des années à sa vie, mais plutôt essayer de rajouter de la vie à ses années

                    6 janvier 2022 à 22:32:45

                    YannC974 a écrit:

                    Mais cela ne change pas le problème, effet il doit tout mettre dans le même fichier, mais normalement avec "w", il ne devrait pas écraser a chaque fois le fichier et n'afficher que l'importation d'une ligne (c'est  à dire la dernière)? (si le code marche)


                    Le fichier en écriture est ouvert via le with... pour toutes les itérations: ça écrira tout dans le même fichier. Si on veut créer un nouveau fichier à chaque itération, il faut coder différemment.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      7 janvier 2022 à 5:57:44

                      Salut,

                      la solution (comme le suggèrent @mps et @umfred) est de créer tes fichiers dans ta boucle for :

                      with open(input_file) as f:
                          reader = csv.reader(f, delimiter=';')
                          headers = next(reader)
                          for row in reader:
                              with open(row[0], "w") as out_csv:
                                  writer = csv.writer(out_csv, delimiter=";")
                                  writer.writerows((headers, row))

                      Après si tu n"as pas besoin des entêtes des colonnes dans tes fichiers :

                      with open(input_file) as f:
                          reader = csv.reader(f, delimiter=';')
                          next(reader)
                          for row in reader:
                              with open(row[0], "w") as out_csv:
                                  writer = csv.writer(out_csv, delimiter=";")
                                  writer.writerow(row)




                      -
                      Edité par Anonyme 7 janvier 2022 à 7:08:13

                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 janvier 2022 à 8:27:38

                        Diablo76 a écrit:

                        Salut,

                        la solution (comme le suggèrent @mps et @umfred) est de créer tes fichiers dans ta boucle for :

                        with open(input_file) as f:
                            reader = csv.reader(f, delimiter=';')
                            headers = next(reader)
                            for row in reader:
                                with open(row[0], "w") as out_csv:
                                    writer = csv.writer(out_csv, delimiter=";")
                                    writer.writerows((headers, row))

                        Après si tu n"as pas besoin des entêtes des colonnes dans tes fichiers :

                        with open(input_file) as f:
                            reader = csv.reader(f, delimiter=';')
                            next(reader)
                            for row in reader:
                                with open(row[0], "w") as out_csv:
                                    writer = csv.writer(out_csv, delimiter=";")
                                    writer.writerow(row)




                        -
                        Edité par Diablo76 il y a environ 1 heure

                        Super merci pour ce petit bout de code qui correspond à ce que je voulais par rapport aux lignes et fichiers.  
                        Maintenant que j'ai cette première étape de fait, il ne me reste plus qu'à normaliser les fichiers, à pouvoir poser les colonnes aux bons endroits.

                        Merci pour cette étape.

                        -
                        Edité par YannC974 7 janvier 2022 à 8:27:59

                        • Partager sur Facebook
                        • Partager sur Twitter

                        ​"Quand on ne peut pas changer le monde, il faut changer le décor."

                        Il ne faut pas chercher à rajouter des années à sa vie, mais plutôt essayer de rajouter de la vie à ses années

                          7 janvier 2022 à 12:10:23

                          moi, perso, plutôt que de faire un fichier par ligne, je mettrais tout dans un fichier en me basant sur soit un fichier type json, par exemple (il y a d'autres façons de le représenter):

                          {
                              "config1":{
                                  "nom": "Nom1",
                                  "session": "session1",
                                  "criteres":{
                                           1: "F",
                                           2: "AETW01",
                                           3: "1900",
                                           4: "job1",
                                             },
                                         },
                              "config2":{
                                  "nom": "Nom2",
                                  "session": "session2",
                                  "criteres":{
                                           1: "F",
                                           2: "AETW02",
                                           3: "1901",
                                           4: "job2",
                                             },
                                         },
                          }


                          ou type INI

                          [Nom1]
                          session=session1
                          critere1=F
                          critere2=AETW01
                          critere3=1900
                          critere4=job1
                          
                          [Nom2]
                          session=session2
                          critere1=F
                          critere2=AETW02
                          critere3=1901
                          critere4=job2
                          
                          

                          Après, ça dépend effectivement de la demande.
                          mais tu peux utiliser aussi utiliser ce type de structure pour chacun des fichiers. Et sous python, tu peut utiliser les modules json pour les fichiers json et configparser pour les fichiers ini.
                          un exemple de mise en œuvre/tuto (qui date un peu, mais devrait encore fonctionner) https://deusyss.developpez.com/tutoriels/Python/les-modules-de-configuration/ 

                          • Partager sur Facebook
                          • Partager sur Twitter
                            7 janvier 2022 à 12:22:25

                            umfred a écrit:

                            moi, perso, plutôt que de faire un fichier par ligne, je mettrais tout dans un fichier en me basant sur soit un fichier type json, par exemple (il y a d'autres façons de le représenter):

                            {
                                "config1":{
                                    "nom": "Nom1",
                                    "session": "session1",
                                    "criteres":{
                                             1: "F",
                                             2: "AETW01",
                                             3: "1900",
                                             4: "job1",
                                               },
                                           },
                                "config2":{
                                    "nom": "Nom2",
                                    "session": "session2",
                                    "criteres":{
                                             1: "F",
                                             2: "AETW02",
                                             3: "1901",
                                             4: "job2",
                                               },
                                           },
                            }


                            ou type INI

                            [Nom1]
                            session=session1
                            critere1=F
                            critere2=AETW01
                            critere3=1900
                            critere4=job1
                            
                            [Nom2]
                            session=session2
                            critere1=F
                            critere2=AETW02
                            critere3=1901
                            critere4=job2
                            
                            

                            Après, ça dépend effectivement de la demande.
                            mais tu peux utiliser aussi utiliser ce type de structure pour chacun des fichiers. Et sous python, tu peut utiliser les modules json pour les fichiers json et configparser pour les fichiers ini.
                            un exemple de mise en œuvre/tuto (qui date un peu, mais devrait encore fonctionner) https://deusyss.developpez.com/tutoriels/Python/les-modules-de-configuration/ 

                            Pour la compréhension de mon besoin, j'ai un fichier Excel dans lequel nous avons recensé les différents paramètres de transfert par system d'information etc..
                            Aujourd'hui pour une évolution de ces différents transfert on me demande de générer un fichier.ini ayant cette tête 
                            C'est une exemple : 
                            # CFT MMA S1
                            PART=N1WB01P (colonne 1)
                            
                            # Ascii Ebcdic Text Windows
                            IDF=AETW01 (colonne 2)
                            
                            # Format des records: V ou F
                            RECF=F (colonne E)
                            
                            # Longueur des records
                            RECL=1900 (colonne 4)
                            
                            # Identifiant CFTJOB
                            NIDF=DOSCPELA (Colonne 5)
                            


                            • Partager sur Facebook
                            • Partager sur Twitter

                            ​"Quand on ne peut pas changer le monde, il faut changer le décor."

                            Il ne faut pas chercher à rajouter des années à sa vie, mais plutôt essayer de rajouter de la vie à ses années

                              7 janvier 2022 à 13:23:38

                              En général, dans les fichiers ini, il y a un "header", c'est-à-dire un "titre" de section qui se met entre crochets [titre]; ça indique que les paramètres en dessous appartiennent à cette section. Après, effectivement, ça dépend du contexte et de l'utilisation (soit on cherche le fichier de tel système et on y lit les infos; soit on cherche dans un fichier unique, les infos de tel système)
                              • Partager sur Facebook
                              • Partager sur Twitter

                              exploiter un fichier csv en 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