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 :

spliter une liste


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 144
    Points : 68
    Points
    68
    Par défaut spliter une liste
    Bonjour,
    un petit programme pour compter les mots.J'ai soit un message d'erreur soit une boucle sans fin.Je ne peux pas spliter une liste?



    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
    #!/usr/bin/env python
    #coding=utf-8
     
    fis = raw_input('entrez le nom du fichier a traiter:')
    fs = open(fis,'r')
    n=0
    while 1:
            ab = fs.readlines()
            if ab == " ":
                 break
            cd= ab.split()
     
            n = n+len(cd)
    fs.close()
    print 'ce dossier comporte %s mots'%(n)
    merci pour votre aide

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Tu mélanges l'utilisation de readlines avec readline.

    De plus, si tu utilises readline, chaque ligne est renvoyée avec une fin de ligne (qu'il faut retirer avec rsplit) et la fin de lecture du fichier est détectée avec if ligne == "".

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 144
    Points : 68
    Points
    68
    Par défaut
    Donc comme ca cela devrait fonctionner ...
    Mais j'entre dans une boucle sans fin,je ne comprends pas pourquoi??


    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
     
    #!/usr/bin/env python
    #coding=utf-8
     
    fis = raw_input('entrez le nom du fichier a traiter:')
    fs = open(fis,'r')
    n=0
    while 1:
            ab = fs.readline()
     
            cd= ab.split()
            if ab == " ":
                 break
            n = n+len(cd)
    fs.close()
    print 'ce dossier comporte %s mots'%(n)

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 144
    Points : 68
    Points
    68
    Par défaut
    la methode readline() renvoie une chaine donc je peux spliter.Readlines() renvoie une liste donc non splitable.
    Ok ca c'est vu maintenant pourquoi je ne peux pas sortir un résultat?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 144
    Points : 68
    Points
    68
    Par défaut
    voila donc le code avec chaine

    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
     
    #!/usr/bin/env python
    #coding=utf-8
     
    fis = raw_input('entrez le nom du fichier a traiter:')
    fs = open(fis,'r')
    n=0
    while 1:
            ch = fs.readline()
            if ch == " ":
                 break
            cd= ch.split()
     
            n = n+len(cd)
    fs.close()
    print 'ce dossier comporte %s mots'%(n)
    et il part dans une boucle sans fin et ...sans message d'erreur

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Dans mon message précédent, je voulais dire rstrip au lieu de split.

    Ci-dessous ton code corrigé:

    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
     
    #!/usr/bin/env python
    #coding=utf-8
     
    fis = raw_input('entrez le nom du fichier a traiter:')
    fs = open(fis,'r')
    n=0
    while 1:
            ab = fs.readline()
            if ab == "":
                 break
            ab = ab.rstrip('\r\n ').split()
            n = n+len(ab)
    fs.close()
    print 'ce dossier comporte %s mots'%(n)
    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 144
    Points : 68
    Points
    68
    Par défaut
    ok super ca fnctionne mais si tu pouvait m'expliquer pourquoi cela partait en boucle et sans message d'erreur je serais ravi d'avoir appris qqchose
    merci

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 184
    Points
    184
    Par défaut
    Salut !

    L'erreur de ton script était, comme l'avait indiqué Tyrtamos", de considérer que " " (1 blanc) indiquait la fin du fichier, alors que c'est "" (string vide... comme c'est triste, un string vide).

    ----
    EDIT:

    Comme tu attendais " " pour fermer le fichier et que lui t'envoyait "", tu ne sortais jamais de ta boucle.

    ----

    Le seul problème qui persiste est que est considéré comme 1 mot tout ensemble de caractères non-blancs encadrés par 2 caractères blancs.
    C'est à dire que si un symbole de ponctuation est collé au mot qui le précède et au mot qui le suit, l'ensemble ne comptera que comme 1 mot.
    Perso, je déciderais de vivre avec.

    Pour la bonne bouche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def comptemots(filename):
        total = 0
        # with/as ne marche qu'avec Python2.6 et superieur.
        with open(filename) as f:
            for line in f:
                total += len(line.rstrip().split())
        return total
     
    filename = raw_input('Veuillez entrer le nom du fichier a traiter : ')
    print 'Le fichier %s comporte %s mots.' % (filename, comptemots(filename))
    1. with/as est "context manager" qui se charge de fermer le fichier à la sortie du bloc. En Python 2.5, on peut l'utiliser avec la ligne "from __future__ import with_statement".
    Dans les versions antérieures, on le remplacera par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    f = open(filename)
    #traitement
    f.close()
    2. une boucle for est + rapide qu'un while. De plus, tu ne tomberas jamais dans une boucle infinie avec une telle boucle.

    3. Un objet fichier est son propre itérateur (du moins, dans les versions récentes de Python, mais je ne sais plus à partir de laquelle), il n'est donc pas nécessaire de faire appel à f.readlines() pour le parcourir avec une boucle for ;

    4. rstrip supprime les caractères blancs par défaut

    5. le reste n'est qu'optimisation.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 144
    Points : 68
    Points
    68
    Par défaut
    comme c'est triste, un string vide
    Bravo j'aime beaucoup!!!

    merci pour toutes ces explications bien utiles.

  10. #10
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Citation Envoyé par nardo47 Voir le message
    1. with/as est "context manager" qui se charge de fermer le fichier à la sortie du bloc. En Python 2.5, on peut l'utiliser avec la ligne "from __future__ import with_statement".
    Dans les versions antérieures, on le remplacera par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    f = open(filename)
    #traitement
    f.close()
    Le but principal d'un with est de s'assurer que l'action de sortie de contexte soit effectuée.
    Dans ton cas, le f.close ne se fera pas si une exception est levée.
    Ce serait donc plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    f = open(filename)
    try:
        # traitement
    finally:
        f.close()
    On peut également entourer le f.close d'un try/except pour éviter que le f.close lui-même ne lève une exception.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 144
    Points : 68
    Points
    68
    Par défaut
    Juste pour rire
    si on reprend le premier code:



    on remplace readlines par readline (une chaine pas une liste) et on enleve l'espace dans
    if ab =="":
    Bingo cela fonctionne
    Et grace a ces deux erreurs j'ai appris plein de trucs et de machins...
    Vraiment super ce site
    et merci à ceux qui sont intervenus
    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
     
    #!/usr/bin/env python
    #coding=utf-8
     
    fis = raw_input('entrez le nom du fichier a traiter:')
    fs = open(fis,'r')
    n=0
    while 1:
            ab = fs.readline()
            if ab == "":
                 break
            cd= ab.split()
     
            n = n+len(cd)
    fs.close()
    print 'ce dossier comporte %s mots'%(n)

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 184
    Points
    184
    Par défaut
    Citation Envoyé par Antoine_935 Voir le message
    Le but principal d'un with est de s'assurer que l'action de sortie de contexte soit effectuée.
    Tout à fait d'accord, je n'étais pas rentré dans les détails paske je suis un gros fainéant !

    Citation Envoyé par Antoine_935 Voir le message
    On peut également entourer le f.close d'un try/except pour éviter que le f.close lui-même ne lève une exception.
    Mais, dans ce cas-là, quelle est l'action à faire si le f.close() lève une exception ?
    Je n'ai pas lu le PEP correspondant en détail, mais il me semblait qu'il était écrit à un moment qu'on ne pouvait pas rattraper toutes les erreurs (et que si le f.close() levait une exception, on avait peut-être de + gros problèmes, mais je fabule peut-être/sûrement/comme d'hab).

    Quoiqu'il en soit, tu as eu raison de me corriger et d'apporter + de précisions !

    Citation Envoyé par yvkoe Voir le message
    merci à ceux qui sont intervenus
    De rien, bonne continuation avec Python.

  13. #13
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Citation Envoyé par nardo47 Voir le message
    Mais, dans ce cas-là, quelle est l'action à faire si le f.close() lève une exception ?
    Je n'ai pas lu le PEP correspondant en détail, mais il me semblait qu'il était écrit à un moment qu'on ne pouvait pas rattraper toutes les erreurs (et que si le f.close() levait une exception, on avait peut-être de + gros problèmes, mais je fabule peut-être/sûrement/comme d'hab).
    Concrètement, si ton f.close() lève une exception, la seule chose que tu peux faire c'est... rien. Enfin si, peut-être logger, prendre quelques mesures de nettoyage. Une erreur au close signifie que le fichier n'est plus ouvert. Ca peut arriver de différentes manières. Dans le cas de sockets par exemple, le descripteur est fermé par l'os après certains types d'erreurs. Un close échouerait donc lamentablement, plantant éventuellement ton script.

  14. #14
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    En ce qui me concerne, je n'utilise pas with, mais j'ai pris en compte la gestion de la fermeture de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    def machin(nfc):
        f = None
        try:
            f = open(nfc, 'r')
            # .....
            # .....
        finally:
            if f != None:
                f.close()
    L'avantage, c'est que si l'erreur est au niveau de l'open, le close n'est pas exécuté. Ce n'est toujours pas parfait puisque f.close() peut encore déclencher une erreur. On peut peut-être encore avoir un try à l'intérieur de finally pour traiter les erreurs de close, mais ça commence à devenir compliqué. Et puis ça dépend de la nature de l'application.

    Tyrtamos

    edit: solution déjà citée plus haut: j'aurais dû tout lire!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    Points : 184
    Points
    184
    Par défaut
    Citation Envoyé par Antoine_935 Voir le message
    logger, prendre quelques mesures de nettoyage.
    Effectivement, c'est une bonne idée : j'en étais encore resté à essayer de corriger la cause de l'erreur, et je ne voyais pas quoi faire.

    Citation Envoyé par tyrtamos Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    def machin(nfc):
        f = None
        try:
            f = open(nfc, 'r')
            # .....
            # .....
        finally:
            if f != None:
                f.close()
    L'avantage, c'est que si l'erreur est au niveau de l'open, le close n'est pas exécuté.
    Le problème que je vois (mais c'est mon analyse, peut être mets-tu + de chose dans le finally ou peut-être me trompe-je tout simplement), c'est que si l'ouverture ne marche pas, on n'est pas averti.
    Quand j'essaie d'ouvrir un fichier qui n'existe pas (problème de path, par exemple), j'aime bien être au courant.

    Sinon, histoire de pinailler :
    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
     
    # boaf
    if f != None:
        f.close()
     
    # mieux
    if f is not None:
        f.close()
     
    # le top !
    if f:
        f.close()
     
    # l'horreur absolue !
    f and f.close()
    J'avoue avoir fait de la résistance, à continuer à tester comme toi, mais finalement, j'ai pris goût à ce genre de test.
    Après, je ne cherche pas à te convaincre absolument, chacun son goût !

  16. #16
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bien vu, nardo47.

    J'ai voulu faire simple, mais en fait j'utilise quelque chose d'un peu plus lourd parce que j'aime bien aussi être averti quand il y a un pb:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    def machin(nfc):
        f = None
        try:
            f = open(nfc, 'r')
            # .....
            # .....
            f.close()
        except IOError:
            if f != None:
                f.close()
            raise   # pour renvoyer l'exception à l'appelant
    Merci pour les autres remarques, mais je préfère privilégier la clarté du code quitte à ne pas être très élégant, tant pour faciliter le debugging que pour comprendre facilement ce que j'ai fait dans 3 mois.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

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

Discussions similaires

  1. [MFC] Retourner une liste d'objets
    Par 1cado dans le forum MFC
    Réponses: 10
    Dernier message: 28/07/2003, 12h11
  2. Faire une liste de device??
    Par jackjack dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2003, 14h43
  3. Réponses: 4
    Dernier message: 24/04/2003, 22h28
  4. Générer une liste
    Par pfredin dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/04/2003, 15h30
  5. tri d'une liste
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 09/01/2003, 18h08

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