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 :

Extraction de données spécifiques .csv


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Par défaut Extraction de données spécifiques .csv
    Bonjour à toutes et tous,

    Je débute en Python (depuis lundi...), et j'ai qq problèmes avec la programmation.

    Je cherche à écrire un programme qui extrait certaines colonnes d'un fichier .csv pour les envoyer dans un nouveau fichier .csv

    Le programme définirait une fonction qui prendrait en entrée:
    - le nom du fichier source .csv,
    - le nom du fichier de destination .csv,
    - une liste de valeurs correspondant aux colonnes désirées.

    Par exemple:
    def Extract_Data('Source_file.csv', 'Dest_file.csv', [0, 2, 6, 18])

    Je possède des données .csv avec une trentaine de colonnes (et qq 4000 lignes). Je voudrais pouvoir extraire certaines colonne au choix (avec toutes les lignes) pour pouvoir utiliser par la suite ces données spécifiques. Je me répète mais c'est pour être clair.

    J'ai lu la documentation Python pour les fichiers .csv mais je n'arrive pas à faire ce que je veux. J'arrive à afficher plusieurs colonnes sur la console, j'arrive à extraire une colonne mais pas plusieurs au choix...

    Voilà si quelqu'un pouvait me donner un gros petit coup de pouce j'en serais très reconnaissant

    Merci et bon dimanche sous la pluie :,(

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 679
    Par défaut
    Salut,

    Citation Envoyé par Clechan Voir le message
    Voilà si quelqu'un pouvait me donner un gros petit coup de pouce j'en serais très reconnaissant
    Le CSV reader retourne une liste pour chaque ligne lue.
    Fabriquons une liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> row = list(range(26))
    >>> row
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 2
    2, 23, 24, 25]
    >>>
    puis si on veut extraire les colonnes [0, 2, 6, 18], c'est une boucle "for" qui récupère le contenu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> for i in [0, 2, 6, 18]:
    ...    print(row[i])
    ...
    0
    2
    6
    18
    >>>
    Bien sûr plutôt que d'afficher, çà serait mieux d'en faire une nouvelle liste... et fabriquer une fonction extract_columns(row, columns) qui retourne cette liste.

    Citation Envoyé par Clechan Voir le message
    Je débute en Python (depuis lundi...), et j'ai qq problèmes avec la programmation.
    C'est normal: la programmation, c'est pas intuitif... et si vous pensez que y arriver sans passer un minimum de temps dans un tuto. pour apprendre les bases... c'est pas gagné.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Par défaut
    Salut,

    Merci pour la réponse, j'ai toujours qq petits soucis. Voilà mon bout de code pour le moment:
    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
     
    import csv
     
    def Column(fileReading,fileWriting,value_desired):
     
       with open(fileReading, 'rb') as originFile:
             with open(fileWriting, 'wb') as destFile:
     
                    reader = csv.reader(originFile, delimiter = ';')
                    writer = csv.writer(destFile, delimiter = ';')
     
                           for i in value_desired:
                                print(row[i])
                                writer.writerow([row[i]])
     
    originFile.close()
    destFile.close()
    Quand ça veut bien marcher, je ne récupère en sortie que les dernières lignes de chaque colonne demandée. Idem dans le fichier d'écriture où seules ces dernières valeurs sont affichées, et elles sont affichées dans une seule colonne... alors que j'aimerais bien que les colonnes restent des colonnes

    Je pense que peut-être l'erreur (un partie de l'erreur au moins) vient du fait que je ne stocke pas les valeurs intermédiaires qq part, et donc Python me sort forcément les dernières valeurs lues. Mais je n'arrive pas à écrire qq chose qui fonctionne

    Merci et bon début de semaine

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 679
    Par défaut
    Salut,

    Citation Envoyé par Clechan Voir le message
    Je pense que peut-être l'erreur (un partie de l'erreur au moins) vient du fait que je ne stocke pas les valeurs intermédiaires qq part, et donc Python me sort forcément les dernières valeurs lues. Mais je n'arrive pas à écrire qq chose qui fonctionne
    Côté Python votre code est soit incomplet, soit incorrect.
    Pour stocker les valeurs intermédiaires, je vous ai suggéré d'utiliser une liste.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Par défaut
    Salut,

    Effectivement j'ai mal copié-collé mon code, il manquait une ligne avec une première boucle for. Voici la version qui fonctionne:

    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
     
    import csv
     
    fileReading = 'Data.csv'
    fileWriting = 'Data2.csv'
    value_desired = [0,1,3]
     
    with open(fileReading, 'rb') as originFile: 
        with open(fileWriting, 'wb') as destFile: 
     
            reader = csv.reader(originFile, delimiter = ';')
            writer = csv.writer(destFile, delimiter = ';')
            for row in reader: #j'avais oublié cette ligne dans le poste précédent
                for i in value_desired:
                    print (row[i])    
                    writer.writerow([row[i]])
     
    originFile.close()
    destFile.close()
    Python me sort bien les valeurs des bonnes colonnes demandées. Mais il m'affiche tout dans une seule colonne dans le nouveau fichier .csv.
    Il lie les valeurs des colonnes ligne par ligne et les affiches ainsi.

    Je souhaiterai pouvoir garder les données rangées colonne par colonne. Soit directement dans différentes colonnes si c'est possible, soit dans une seule colonne en séparant les valeurs par un ',' ou un ';'. Je crois avoir vu que ça fonctionnait plutôt comme ça.

    Merci

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 679
    Par défaut
    Citation Envoyé par Clechan Voir le message
    Je souhaiterai pouvoir garder les données rangées colonne par colonne. Soit directement dans différentes colonnes si c'est possible, soit dans une seule colonne en séparant les valeurs par un ',' ou un ';'. Je crois avoir vu que ça fonctionnait plutôt comme ça.
    liste...
    Un forum n'est pas la possibilité de remettre à plus tard l'apprentissage des bases et si vous ne pensez pas "liste" sur ce coup là, c'est que vous avez sauté des étapes.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Ton code n'est pas loin du but! Il te reste effectivement à manipuler des listes.

    Dans ton code, row est une liste des éléments de la ligne lue. Par exemple: ligne = ['toto', 123, 789, 'tata', 'titi']

    Si tu ne retiens que les colonnes données par une liste d'indices (par exemple colonnes=[1,3]), tu peux avoir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ligne2 = []
    for i in colonnes:
        ligne2.append(ligne[i])
    Et tu n'as plus qu'à écrire cette nouvelle ligne "ligne2" dans le fichier csv destination avec writerow.

    Autre chose: si c'est Python 3, l'ouverture des fichiers csv n'est pas binaire (ni 'rb', ni 'wb'). L'avantage est qu'on peut préciser un encodage (pour traiter des caractères accentués), alors que c'était plus compliqué à faire avec Python 2.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2017
    Messages : 4
    Par défaut
    Bonjour,

    Effectivement il ne manquait pas grand chose. Comme quoi 2-3 lignes de code changent la vie!

    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
    fileReading = 'Data.csv'
    fileWriting = 'Data2.csv'
    value_desired = [0,1,3]
     
    with open(fileReading, 'rb') as originFile: 
        with open(fileWriting, 'wb') as destFile:
     
            reader = csv.reader(originFile, delimiter = ';')
            writer = csv.writer(destFile, delimiter = ';')
            for row in reader:
                ligne2 = []
                for i in value_desired:
                    ligne2.append(ligne[i])
                print (ligne2)
                writer.writerow(ligne2)
     
    originFile.close()
    destFile.close()
    J'ai réussi autrement juste après en écrivant ce bout de code à la place de la dernière boucle for (lignes 12-15)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    new_row = [row[i] for i  in value_desired]
                print (new_row)
                writer.writerow(new_row)
    Je ne sais pas quelle est la différence fondamentale derrière le code mais le résultat est le même dans les 2 cas.

    Merci pour la réponse en tout cas

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 679
    Par défaut
    Citation Envoyé par Clechan Voir le message
    Effectivement il ne manquait pas grand chose. Comme quoi 2-3 lignes de code changent la vie!

    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
    fileReading = 'Data.csv'
    fileWriting = 'Data2.csv'
    value_desired = [0,1,3]
     
    with open(fileReading, 'rb') as originFile: 
        with open(fileWriting, 'wb') as destFile:
     
            reader = csv.reader(originFile, delimiter = ';')
            writer = csv.writer(destFile, delimiter = ';')
            for row in reader:
                ligne2 = []
                for i in value_desired:
                    ligne2.append(ligne[i])
                print (ligne2)
                writer.writerow(ligne2)
     
    originFile.close()
    destFile.close()
    Le code que vous avez posté ne fonctionne pas car vous lisez dans la variable "row" pas dans "ligne", c'est ce qui arrive lorsqu'on copie du code sans trop chercher à le comprendre.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. extraction de données dans un fichier csv
    Par yeddes dans le forum R
    Réponses: 1
    Dernier message: 22/04/2015, 13h23
  2. Extraction de donnée sur TALEND de MongoDB vers XML ou CSV
    Par djtrp dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 24/03/2014, 15h41
  3. [2005] Extraction de données depuis un fichier CSV
    Par alaabed dans le forum SSIS
    Réponses: 3
    Dernier message: 22/04/2011, 14h07
  4. Extraction de données d'un fichier csv
    Par freyr dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 24/11/2010, 09h08
  5. [Débutant] Extraction de données en CSV ?
    Par ghohm dans le forum SQL
    Réponses: 23
    Dernier message: 21/12/2007, 16h28

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