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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 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,

    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

  3. #3
    Membre confirmé
    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
    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 confirmé
    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
    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 confirmé
    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
    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 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
    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

  7. #7
    Membre confirmé
    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
    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 expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 141
    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 confirmé
    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
    Par défaut
    comme c'est triste, un string vide
    Bravo j'aime beaucoup!!!

    merci pour toutes ces explications bien utiles.

  10. #10
    Membre émérite
    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
    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.

+ 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