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 :

Obtenir la valeur de la cellule d'à côté de celle où se trouve un mot dans un fichier csv avec Python


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2022
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2022
    Messages : 22
    Par défaut Obtenir la valeur de la cellule d'à côté de celle où se trouve un mot dans un fichier csv avec Python
    Bonjour.

    J'ai un fichier csv de milliers de lignes avec 3 colonnes.
    J'ai créé une interface dans laquelle l'utilisateur rentre un mot, et ensuite quand il clique sur valider, il faut que le programme aille chercher le mot dans un fichier csv (et il s'y trouve forcément par contre, il n'y a pas la possibilité qu'il ne s'y trouve pas) puis me renvoie la valeur qui se trouve au niveau de la même ligne, mais dans la cellule d'à côté. Les mots sont dans la 3è colonne, les valeurs numériques dans la 2è.

    Vous savez comment faire ça avec Python ?

    J'ai essayé en passant par pandas, en utilisant un enumerate, en passant par un readlines() et en faisant une fonction mais rien ne marche.

    Par exemple ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data = pd.read_csv('data2021_2.csv', delimiter=';', index_col="COL1")
    print(df[df['COL3']==x].index.values)
    first = data.loc["mavaleur"]
    print(first)
    x étant égal à entry1.get(), afin d'extraire le mot que l'utilisateur a écrit dans l'interface.

    Merci d'avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Chercher une chaîne de caractères dans une liste de listes est ce qu'on a appris dans n'importe quel tuto (avant de faire de petits projets).... donc oui on devrait savoir faire çà (avant même de se lancer dans pandas).

    Qu'est ce qui vous bloque?

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

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2022
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2022
    Messages : 22
    Par défaut
    Le problème c'est que la valeur entrée par l'utilisateur est à chaque fois différente, donc je la mets dans une variable et quand je mets le nom de ma variable dans mon programme rien ne marche.
    Si je mets littéralement le mot recherché entre guillemets dans mon code, ça le trouve, mais quand je mets la variable x (qui est =entry1.get()) ça ne marche pas.

    Et je ne sais pas très bien faire ça avec un fichier csv, je ne sais pas comment appeler chaque ligne, je ne suis pas avec une liste du type liste=[pomme, poire, orange].

    Mais j'en conviens, j'ai des lacunes, même en étant en école d'ingénieur. On n'a pas du tout de cours d'informatique, juste 2-3 TP sur le tas, on apprend (essaye d'apprendre) tout tout seul de façon sauvage avec ce qu'on peut bien trouver en ligne. Je m'en vois désolé mais je veux apprendre.

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Bonjour,

    ne serait-il pas plus efficace de stocker le contenu du fichier CSV dans une base de données style SQLite3 et requêter la table avec le mot fourni par l'utilisateur pour renvoyer la valeur voulue ?

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2022
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2022
    Messages : 22
    Par défaut
    Je vais essayer, merci du conseil.

    @wiztricks

    Pour m'afficher la ligne entière du fichier csv où se trouve le mot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import csv
    import sys
     
     
    com = input('Entrez la commune à trouver\n')
     
    csv_file = csv.reader(open('commune2021_2.csv', "r"), delimiter=",")
     
    for row in csv_file:
       if com == row[2]:
           print (row)
    Est-ce que ceci vous semble juste ?
    Ca ne fonctionne pas pourtant. J'obtiens un list index out of range, même si les communes sont dans la 3è colonne donc à l'index numéro 2.

    Et si je mets row[0], je n'ai plus d'erreur et j'obtiens comme réponse dans le shell ceci : >>>
    En gros il ne se passe rien.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par nsl31 Voir le message
    Est-ce que ceci vous semble juste ?
    Ca ne fonctionne pas pourtant.
    Si ça ne fonctionne pas, c'est que ce n'est pas juste... et si l'accès à row[2] lève un "index out of range", c'est que row ne contient pas le nombre de colonnes que vous espériez.
    Reste à regarder à quoi ressemble row et réfléchir à la cause (probablement un mauvais délimiteur et/ou une ligne bizarre dans le fichier).

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

  7. #7
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Si vous voulez tester l'insertion de votre fichier CSV dans une base SQLite3 (à condition d'avoir le programme, trouvable facilement sur le net) :

    Dans une console, tapez les commandes suivantes, là où se trouve votre fichier CSV :

    Sous Linux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sqlite3 ma_bdd.db
    .mode csv
    .separator ,
    .import mon_fichier_csv ma_table
    .quit
    Sous Windows avec l'utilitaire se trouvant ici : https://www.sqlite.org/download.html (dans la section Precompiled Binaries for Windows, choisir le zip sqlite-tools),

    double clic sur l'exécutable sqlite3.exe puis, dans la console qui vient de s'ouvrir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    .open ma_bdd.db
    .mode csv
    .separator ,
    .import mon_fichier_csv ma_table
    .quit
    S'il y a un soucis d'intégrité dans les données du CSV, notamment un séparateur non attendu ou non trouvé, vous allez vite le savoir.

    EDIT : pensez à mettre des noms de champs en 1ère ligne de votre CSV si vous testez ma méthode !

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par Arioch Voir le message
    ne serait-il pas plus efficace de stocker le contenu du fichier CSV dans une base de données style SQLite3 et requêter la table avec le mot fourni par l'utilisateur pour renvoyer la valeur voulue ?
    Si c'est un fichier qui a une durée de vie courte et qu'on recherche les entrées colonne 2, un dictionnaire fabriqué une seule fois... et utilisé pour toutes les recherches devrait suffire (d'autant qu'on peut le sauvegarder via pickle).
    Après si on veut faire une "vraie" application, la petite base de données est une bonne piste. Mais si le PO ne sait pas mettre au point un programme de 10 lignes qui part en IndexError, il a du boulot côté tuto et exercices à faire pour maîtriser les bases.

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

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2022
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2022
    Messages : 22
    Par défaut
    Citation Envoyé par Arioch Voir le message
    Si vous voulez tester l'insertion de votre fichier CSV dans une base SQLite3 (à condition d'avoir le programme, trouvable facilement sur le net) :

    Dans une console, tapez les commandes suivantes, là où se trouve votre fichier CSV :

    Sous Linux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sqlite3 ma_bdd.db
    .mode csv
    .separator ,
    .import mon_fichier_csv ma_table
    .quit
    Sous Windows avec l'utilitaire se trouvant ici : https://www.sqlite.org/download.html (dans la section Precompiled Binaries for Windows, choisir le zip sqlite-tools),

    double clic sur l'exécutable sqlite3.exe puis, dans la console qui vient de s'ouvrir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    .open ma_bdd.db
    .mode csv
    .separator ,
    .import mon_fichier_csv ma_table
    .quit
    S'il y a un soucis d'intégrité dans les données du CSV, notamment un séparateur non attendu ou non trouvé, vous allez vite le savoir.

    EDIT : pensez à mettre des noms de champs en 1ère ligne de votre CSV si vous testez ma méthode !
    Bonjour,
    en effet, arrivé à la ligne "import", ça m'affiche "cannot open...".
    Ce sont pourtant les documents officiels de l'INSEE que j'ai téléchargés, ils sont donc inutilisables...
    J'ai tenté de les nettoyer en effaçant certaines colonnes inutiles où il manquait des données à certaines lignes (j'ai cru comprendre que c'était mauvais pour l'utilisation d'un fichier csv) et en enlevant d'autres données inutiles à la main, pensant que c'est ce qui pouvait causer problème.
    Je précise que j'ai essayé l'import avec tous les types de séparateurs, pour voir.

  10. #10
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Citation Envoyé par nsl31 Voir le message
    en effet, arrivé à la ligne "import", ça m'affiche "cannot open...".
    Là, il me semble que SQLite se plaint de ne pouvoir ouvrir le fichier source CSV, et donc de l'importer.

    Au pire, testez ce bout de code en indiquant précisément le nombre de séparateurs attendu en début de script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    nb_separator: int = 6 # 6 valeur bidon
    line_nr: int = 0
    with open('fichier.csv') as lines:
        for line in lines:
            line_nr += 1
            if line.count(',') != nb_separator:
                print(f'lg.{line_nr} error : {line.strip()}')
    Code écrit à la volée, pas testé. Désolé !

  11. #11
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour
    Citation Envoyé par nsl31 Voir le message
    Ca ne fonctionne pas pourtant. J'obtiens un list index out of range, même si les communes sont dans la 3è colonne donc à l'index numéro 2.

    Et si je mets row[0], je n'ai plus d'erreur et j'obtiens comme réponse dans le shell ceci : >>>
    C'est le fichier officiel insee "Code officiel géographique" ???
    Dans ce fichier, la deuxième colonne "COM" est le code postal
    Puisque c'est la seconde colonne, il faut tester dans notre liste : l'index 1 et pas 2 comme dans ton code (et toi qui parles de 3ème colonne ? )

    J'ai tenté de les nettoyer en effaçant certaines colonnes inutiles où il manquait des données à certaines lignes
    ps: ce fichier est un csv valide, il n'y a donc aucune bonne raison de le retravailler

    pourtant les documents officiels de l'INSEE que j'ai téléchargés
    l'officiel, c'est cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TYPECOM,COM,REG,DEP,CTCD,ARR,TNCC,NCC,NCCENR,LIBELLE,CAN,COMPARENT
    COM,01015,84,01,01D,011,1,ARBOYS EN BUGEY,Arboys en Bugey,Arboys en Bugey,0104,
    COMD,01015,,,,,1,ARBIGNIEU,Arbignieu,Arbignieu,,01015
    COM,01016,84,01,01D,012,1,ARBIGNY,Arbigny,Arbigny,0117,

  12. #12
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    424
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 424
    Par défaut C'est quoi le séparateur de colonnes ?
    Dans le premier post (relatif à Panda), on a delimiter=';'
    Dans le second (avec le csv.reader), on a delimiter=","
    Donc, il faudrait déjà savoir. C'est , ou ;
    Si on se trompe, on n'a qu'une seule colonne avec tout dedans et l'indexError est logique :-)

  13. #13
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par papajoker Voir le message
    C'est le fichier officiel insee "Code officiel géographique" ???
    Dans ce fichier, la deuxième colonne "COM" est le code postal
    Dans ce fichier là, le "delimiteur" est "," et il a bien plus de 2 colonnes éventuellement vides => on ne devrait pas avoir IndexError.
    Par ailleurs, la deuxième colonne n'est pas le code postal mais le numéro de la commune (ce qui est différent car la poste peut avoir regroupé plusieurs communes sous un même code postal).

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

  14. #14
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2022
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2022
    Messages : 22
    Par défaut
    C'est bon, j'ai (presque) réussi, merci à tous de vos conseils. Je suis passé par df=read_excel et des petits bidouillages ensuite, et ça marche.

    Le presque c'est ma dernière étape :
    après avoir récupéré toutes les données nécessaires (numéro de département, code Insee, etc...) je les intègre dans l'URL.
    Normalement quand je mets l'URL "à la main" dans Google en rentrant moi-même les numéros de département et Insee et que je valide, le fichier correspondant dans la base de données se télécharge automatiquement.

    Cependant ici, je "reconstruis" l'URL avec les données qui varient en fonction des choix de l'utilisateur (chacun écrira sa commune dans ma petite interface et aura un code Insee différent), je transforme l'URL en string, j'importe webdriver depuis Selenium ainsi que ChromeDriverManager, j'écris driver.get("mon_url"), je lance le tout et là :
    une page Google s'ouvre rapidement un fichier se télécharge, la page Google se referme automatiquement aussitôt (alors que je ne l'ai pas demandé mais tant mieux ça m'arrange), et quand je vais dans les téléchargements pour voir ce qui vient d'être téléchargé, il ne s'agit pas du fichier que je voulais (qui est un fichier BZ2 en .tar) mais d'un fichier TMP.

    Sauriez-vous pourquoi?

Discussions similaires

  1. [XL-2016] Obtenir la valeur d'une cellule. Différement.
    Par Jenjango dans le forum Excel
    Réponses: 7
    Dernier message: 19/07/2018, 19h42
  2. Comment ajouter des valeurs dans un fichier CSV avec PERL?
    Par GandalfLeGris1 dans le forum Langage
    Réponses: 9
    Dernier message: 06/06/2018, 20h24
  3. [XL-2007] Valeur d'une cellule change automatiquement selon celle d'une autre cellule
    Par FrancisZheng dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 07/12/2015, 16h33
  4. Réponses: 3
    Dernier message: 23/04/2015, 08h50
  5. Réponses: 5
    Dernier message: 30/05/2006, 12h29

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