IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Assembler 2 fichiers csv [Python 3.X]


Sujet :

Python

  1. #1
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut Assembler 2 fichiers csv
    Bonjour,
    Je dispose de deux fichiers (en fait j'en aurais une dizaine au final) que je souhaiterais assembler. Le problème, c'est que les lignes ne sont pas dans le même ordre dans les deux (ou plus) fichiers.
    J'aurais besoin d'un ou de plusieurs avis sur la méthode à employer.

    Le premier est composé d'un classement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Joueur ; Classement officiel ; Classement réel
    Joueur A ; 100 ; 101
    Joueur B ; 95 ; 98
    Joueur C ; 90 ; 88
    Joueur D ; 80 ; 82
    Le deuxième est composé d'un classement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Joueur ; Classement officiel ; Classement réel
    Joueur A ; 100 ; 103
    Joueur D ; 80 ; 98
    Joueur C ; 90 ; 94
    Joueur B ; 95 ; 92
    Je souhaiterais obtenir un fichier csv comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Joueur ; Classement officiel ; Classement mois 1 ; Classement mois 2
    Joueur A ; 100 ; 101 ; 103
    Joueur D ; 80 ; 82 ; 98
    Joueur C ; 90 ; 88 ; 94
    Joueur B ; 95 ; 98 ; 92
    Il y a une petite centaine de joueurs.

    Ce que je pense de plus simple pour l'instant, mais cela peut être long, c'est de récupérer dans le dernier fichier la colonne 0 composée des joueurs et la colonne 1 du classement officiel, puis ensuite parcourir tous les fichiers csv et ajouter la valeur de la colonne 2 lorsque les noms correspondent. Cela implique de faire un test sur la colonne 0. C'est cette étape qui risque de prendre du temps mais je ne vois pas comment faire mieux.
    Pas d'aide par mp.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Si tes fichiers sont petits, tu lis tout, tu charges tout dans une structure (au hasard, une liste de dictionnaires avec le nom du joueur en clé et un set de positions de classement en valeurs), et tu pousses le tout dans un nouveau fichier.

    Après, j'ai du mal à voir comment tu peux avoir 3 descriptions de champs dans la ligne 1 et 4 valeurs dans les lignes suivantes...

  3. #3
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    OK, merci.
    Je modifie mon premier post pour que ce soit plus clair.
    Pour les dicos, j'avoue que ce n'est pas trop mon truc, d'autant qu'il faudra que mon dernier fichier soit classé.
    Après, c'est l'occasion de s'y mettre.
    Pas d'aide par mp.

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Il existe une variante du dictionnaire, qui elle est ordonnée : l'OrderedDict.

    Et pareil je suis du même avis que Bktero.
    1) Tu créer un OrderedDict vide.
    2) Tu lis le 1er fichier (le 1er fichier dictant l'ordre sur le fichier de sortie)
    3) En lisant se fichier tu ajoutes les entrées à l'OrderedDict (chaque clé "JoueurX", va contenir une liste)
    4) Tu fermes le 1er fichier
    5) Tu ouvres les fichiers suivant, et pour chaque ligne, tu repère le nom du joueur, et ca te permet d'étendre la liste (avec les éléments à partir de la 2eme colonne) contenu dans l'OrderedDict correspondant à ce joueur précis.

  5. #5
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Merci à vous, mais je pense que je vais avoir un souci en passant par les dictionnaires.
    En effet, je n'ai pas tout dit :
    J'ai en fait à la place de Joueur A,, B, ... des noms en première colonne, prénoms en deuxième, ...
    Évidemment, deux joueurs peuvent avoir le même nom ou le même prénom.
    Pour la suite, j'ai besoin de garder noms et prénoms (j'imprime un pdf via latex)
    Du coup, il faudrait que je fasse en clé Nom + Prénom puis en valeur une liste qui va contenir [Nom, Prénom, Classement officiel, Classement mois 1, mois 2, ...]
    C'est possible de réaliser cela ?
    Sachant que pour la présentation finale, ce serait bien d'ordonner en fonction du classement officiel ou du dernier mois...
    Pas d'aide par mp.

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Pas besoin d'utiliser un orderedDict, il suffit de lire les fichiers dont tu ne veux pas conserver le classement et en utilisant le nom du joueur comme clef de stocker les colonnes dont tu as besoin dans un dict normal, puis de lire le fichier classé et d'écrire le résultat au fur et à mesure pour profiter du classement.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  7. #7
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Les dictionnaires acceptent des clés "composites" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a = {}
    a[("Herve","Dupont")]=[80,82]
    a[("Albert","Dupont")]=[85,87]
    print(a)
    et si vous travaillez avec les ordereddict c'est pareil, suffit d'initialiser a comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from collections import OrderedDict
    a=OrderedDict()

  8. #8
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Bon, ben merci beaucoup à vous pour ces conseils et exemples.
    J'ai du pain sur la planche...
    Pas d'aide par mp.

  9. #9
    Membre actif
    Profil pro
    Loisir
    Inscrit en
    Novembre 2011
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : Novembre 2011
    Messages : 159
    Points : 284
    Points
    284
    Par défaut
    Bonjour,

    si tu as la possibilité d'utiliser pandas, fais-le. Tu charge chaque csv dans un dataframe en définissant la première ligne et la première colonne comme entêtes de lignes et de colonnes puis tu joins tes deux dataframes en utilisant les entêtes de colonnes comme champs de jointure.

    Pandas est fait pour cela

  10. #10
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Merci, avec pandas, j'arrive presque à ce que je veux.
    J'ai juste un souci : j'utilise merge mais je voudrais exclure la dernière colonne de mon premier fichier. c'est possible ?
    J'arrive à enlever les dernières lignes mais pas la dernière colonne. J'imagine que c'est très simple.
    Pas d'aide par mp.

  11. #11
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Bon, j'ai avancé un peu mais j'ai un souci avec pandas :
    Mes fichiers csv possèdent comme entête (donc 5 colonnes):
    Nom Prénom;Cl. off;2018-10-30;Evol
    et :
    Nom Prénom;Cl. off;2018-11-12;Evol

    J'ai écrit le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    from datetime import date as datebis
     
    today = datebis.today()
    an = today.year
     
    dates=["2018-10-30","2018-11-12"]
    liste_fichiers_csv = ["class-%s.csv"% dates[i] for i in range(len(dates))]
     
    import pandas as pd
    fich=[]
    for k in range(len(dates)):
        fich.append(pd.read_csv(liste_fichiers_csv[k], ";", names=["Nom","Prénom","Cl. off",dates[k]]))
    print(fich[0])
     
    for k in range(1,len(dates)):
        fich[0] = pd.merge(fich[0],fich[k], how = "inner", on = ["Nom","Prénom","Cl. off"])
    print(fich[0])
    le "print(fich[0])" ne me sort pas ce que j'ai prévu, à savoir les 4 premières colonnes.
    Si quelqu'un a une explication...
    Pas d'aide par mp.

  12. #12
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Bon a priori, c'est OK, je suis enfin parvenu à une solution correcte.
    Merci à vous tous.
    Pas d'aide par mp.

  13. #13
    Membre actif
    Profil pro
    Loisir
    Inscrit en
    Novembre 2011
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Loisir

    Informations forums :
    Inscription : Novembre 2011
    Messages : 159
    Points : 284
    Points
    284
    Par défaut
    Bonjour,

    heureux que tu ais trouvé une solution.

    Juste un petit point sur l'écriture pour être plus pythonesque. On évite autant que possible l'itération sur les indices quand on peut l'éviter. Une réécriture rapide (non testée) du dernier code proposé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    from datetime import date
    import pandas as pd
     
    today = date.today()
    an = today.year
     
    dates=["2018-10-30","2018-11-12"]
    liste_fichiers_csv = ["class-%s.csv"% d for d in dates]
     
    fich=[]
     
    for c, d in zip(liste_fichiers_csv, dates):
        f = pd.read_csv(c, ";", names=["Nom","Prénom","Cl. off",d])
        fich.append(f)
     
    print(fich[0])
     
    for f in fich[1:]:
        fich[0] = pd.merge(fich[0],f, how = "inner", on = ["Nom","Prénom","Cl. off"])
     
    print(fich[0])

  14. #14
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Effectivement, merci pour cette amélioration.
    Pas d'aide par mp.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46
  2. Importation de fichier CSV vers une base Interbase
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 15/03/2005, 15h18
  3. Mettre a jour BD avec fichier csv
    Par Looping94510 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 07/02/2005, 18h56
  4. Sortir un fichier csv sur base d une requete
    Par Freeman_80 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 12/01/2005, 11h21
  5. Réponses: 2
    Dernier message: 14/05/2004, 12h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo