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 :

Revue de code - Requête dans un CSV


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de scalpel
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2008
    Messages
    157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2008
    Messages : 157
    Par défaut Revue de code - Requête dans un CSV
    Bonjour à tous,

    L'exercice consistait à extraire d'un fichier texte les lignes correspondant à des prénoms dont la première lettre est située entre F et M inclus. J'ai assez rapidement trouvé la méthode ".spli()" me permettant de travailler dans la "colonne" des prénoms. Mais pour élaborer une "requête", je n'ai rien trouvé, j'ai pourtant cherché plusieurs heures dans la documentation. J'ai essayé du coté des expressions régulières, mais mon niveau actuel ne ma pas permis de comprendre comment les utiliser dans ce contexte. J'ai donc décidé de coder ma propre fonction pour réaliser le "masque" de cette requête. Cela fonctionne très bien, mais je pense qu'il doit y avoir beaucoup plus simple pour cibler dans une plage comprise entre deux lettres

    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
    22
    23
    24
    25
    26
    27
    # Extraire d'un fichier csv les lignes correspondant à des prénoms dont la première lettre est située entre F et M inclus.
     
    # fonctions
    def filtre(debut, fin):
        'creation d une chaine pour la recherche'
        alphabetMaj=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
        alphabetMin=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
        indexDebut=alphabetMaj.index(debut)
        indexFin=(alphabetMaj.index(fin)+1)
        return ''.join(alphabetMaj[indexDebut:indexFin]+alphabetMin[indexDebut:indexFin])
     
    def extraction(source, destination, colonne, filtre):
        'extraction des lignes par rapport a une colonne et un filtre'
        fs=open(source, 'r', encoding="utf-8")
        fd=open(destination, 'w', encoding="utf-8")
        while 1:
            ligne=fs.readline()
            if ligne=='':
                break
            mot=ligne.split(';')[colonne-1]
            if mot[0:1] in filtre:
                fd.write(str(ligne))
        fs.close()
        fd.close()
     
    # main
    extraction('repertoire.csv','extraction.csv', 2, filtre('F','M'))

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par scalpel Voir le message
    mais je pense qu'il doit y avoir beaucoup plus simple pour cibler dans une plage comprise entre deux lettres
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> prenom="Mafalda"
    >>> print("ok" if "F" <= prenom[0] <= "M" else "bad")
    ok
    ...

    Citation Envoyé par scalpel Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    alphabetMaj=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
    alphabetMin=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    alphabetMaj=list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
    alphabetMin=list(map(str.lower, alphabetMaj))
     
    import string
    alphabetMaj=list(string.ascii_uppercase)
    alphabetMin=list(string.ascii_lowercase)

    De plus, comme une chaine est aussi un itérable, finalement les listes ne servent à rien => .index() marche aussi bien pour une chaine que pour une liste.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    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 scalpel Voir le message
    mais je pense qu'il doit y avoir beaucoup plus simple pour cibler dans une plage comprise entre deux lettres
    Tant qu'on reste dans la plage des caractères ASCII, les alphabets majuscules et minuscules sont "ordonnés" correctement.
    Ce qui permet d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> ch = 'c'
    >>> 'A' <= ch.upper() <= 'Z'
    True
    >>>
    et tant qu'on y est les fonctions chr et ord sont aussi intéressantes.
    note: les "trucs" en programmation sont des savoirs faire que l'ont connait parce qu'on a eu le temps de se "cultiver": il y a des trucs qu'on ne peut pas inventer... Vous pourrez chercher tant que vous voulez, sans savoir quoi chercher, vous ne trouverez pas.

    Citation Envoyé par scalpel Voir le message
    Cela fonctionne très bien...
    Si filtre est "fonction", l'instruction if mot[0:1] in filtre: fait un code qui ne fonctionne pas...

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

  4. #4
    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 scalpel Voir le message
    creation d une chaine pour la recherche
    Tu connais la table ascii
    Donc tu pouvais simplement faire ord(caractere) > ord("F") ... (bien sûr, on enlève les ord et )

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Une lettre reste à la base un nombre (nombre représentant son rang dans la liste de la table utf-8)
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> ord("A")
    65
    >>> ord("B")
    66
    >>> chr(ord("A") + 1)
    'B'
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    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
    bizarre ce livre ... nous sommes au chapitre 9 et, les chaines et chr() ord() sont au chapitre 10
    @scalpel donc pas de ta faute, tout est bien expliqué dans le chapitre suivant (chaines, listes)

  7. #7
    Membre confirmé Avatar de scalpel
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2008
    Messages
    157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2008
    Messages : 157
    Par défaut
    Merci beaucoup pour vos, retours, je vais améliorer mon code et c'est vrai qu'il me manque les bases. Je n'aurai jamais imaginé seul que l'on pouvait utiliser les "opérateurs de comparaison" avec les lettres de la même façon qu'avec les nombres.
    J'avoue être un peu "dépité", car sans vous je fais de la m... , même en passant des heures dans la documentation, il faut tout de même avoir une idée de ce que l'on cherche.
    Si je veux arrêter de vous solliciter aussi souvent, il va peut-être falloir que j'arrête le "Swinnen" et que je me tourne vers un cours qui traite plus des bases.
    Ce sera certainement moins amusant, mais probablement plus efficace pour moi qui n'ai aucune notion de programmation.

  8. #8
    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
    Citation Envoyé par scalpel Voir le message
    jamais imaginé seul que l'on pouvait utiliser les "opérateurs de comparaison" avec les lettres de la même façon qu'avec les nombres.
    Pas que ! aussi les chaines. Comme bien d'autres objets

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [1,2] < [3, 4]
    [7,2] > [3, 4]
    [1,2,3] < [3, 4]
    [7, "a"] < [8]

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par scalpel Voir le message
    Je n'aurai jamais imaginé seul que l'on pouvait utiliser les "opérateurs de comparaison" avec les lettres de la même façon qu'avec les nombres.
    Et quand tu feras de l'objet, tu pourras redéfinir les opérateurs "__eq__" (equal), "__ne__" (not equal), "__lt__" (less than) et autres, ce qui te permettra de comparer "truc" avec "chose" et de multiplier "machin" par "bidule".

    Citation Envoyé par scalpel Voir le message
    Si je veux arrêter de vous solliciter aussi souvent, il va peut-être falloir que j'arrête le "Swinnen" et que je me tourne vers un cours qui traite plus des bases.
    Checke ma signature...

    Citation Envoyé par scalpel Voir le message
    Ce sera certainement moins amusant, mais probablement plus efficace pour moi qui n'ai aucune notion de programmation.
    La programmation (écrire un programme) est souvent issue de l'algorithmique (décrire les opérations pour arriver au résultat). Si tu as la logique (et tu sembles l'avoir) la traduire en Python n'est qu'une question d'habitude.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    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 scalpel Voir le message
    J'avoue être un peu "dépité", car sans vous je fais de la m... , car même en passant des heures dans la documentation, il faut tout de même avoir une idée de ce que l'on cherche.
    Certes mais à court terme l'objectif est de construire avec le python que vous connaissez. Sachant que l'intérêt n'est pas dans les lignes que vous allez écrire mais à la démarche que vous allez être obligé de faire pour arriver à les écrire.

    Citation Envoyé par scalpel Voir le message
    Si je veux arrêter de vous solliciter aussi souvent, il va peut-être falloir que j'arrête le "Swinnen" ...
    Le documentation du langage côté opérations sur les chaines de caractères pourrait être une bonne lecture. Vous ne comprendrez pas toujours leur intérêt mais vous aurez une idée confuse de leur existence.

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

  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
    Citation Envoyé par scalpel Voir le message
    J'ai assez rapidement trouvé la méthode ".spli()" me permettant de travailler dans la "colonne" des prénoms.
    Je viens de regarder le corrigé 9.10 et en fait l'exercice est bien autre (que la logique fichier) !
    Justement il faut "pondre" un algo qui va remplacer split, du coup on passe à côté d'un gros travail, même le seul intérêt de cet exercice !

    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
    def chercheCP(ch):
        "recherche dans ch la portion de chaîne contenant le code postal"
        i, f, ns = 0, 0, 0
        # ns est un compteur de codes #
        cc = ""
        # chaîne à construire
        while i < len(ch):
            if ch[i] =="#":
                ns = ns +1
                if ns ==3:    # le CP se trouve après le 3e code #
                    f = 1
                elif ns ==4:    # inutile de lire après le 4e code #
                    break
            elif f ==1:
                cc = cc + ch[i]
            i = i +1
        return cc
    EDIT:

    Cela pose question non ?
    Justement non ! Moi aussi je ne connais pas tout de python et parfois il m'arrive de re-créer la roue (et elle n'est pas très très ronde).

    Voir l'exo que je cite dans ce message, le corrigé "pique", mais il est adapté à un certain niveau de connaissances. Le correcteur fait avec ou plutôt sans (la connaissance de .split())

  12. #12
    Membre confirmé Avatar de scalpel
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2008
    Messages
    157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2008
    Messages : 157
    Par défaut
    Citation Envoyé par papajoker Voir le message
    ...Je viens de regarder le corrigé 9.10 et en fait l'exercice est bien autre...
    C'est ce qui me déroute dans le "Swinnen", je pense qu'il est adapté comme support de cours pour un prof qui maitrise son sujet et qui peut consulter les corrigés. Il va pouvoir orienter ces élèves dans leur recherche de solutions. Seul, je suis en permanence en train de me demander s'il faut que je n'utilise que ce qui vient d'être abordé dans les paragraphes précédents ou si je dois chercher dans d'autres directions, c'est pour cela que je vous sollicite autant et que j'ai besoin de vos retours.

Discussions similaires

  1. pb eval pour le code php dans une feuille xslt
    Par nipepsi dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 10/09/2004, 11h23
  2. Insertion code html dans bdd
    Par jeff37 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/04/2004, 15h03
  3. [Revue de code] Quels outils pour de grosses applis?
    Par franckR dans le forum Choisir un environnement de développement
    Réponses: 1
    Dernier message: 21/03/2004, 10h03
  4. [CODE] Application dans la zone de notification
    Par Rodrigue dans le forum C++Builder
    Réponses: 4
    Dernier message: 29/05/2003, 19h06
  5. [TP]code asm dans une procedure
    Par M.Dlb dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 17/08/2002, 20h43

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