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 :

Ouverture fichier text


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Par défaut Ouverture fichier text
    Slt tout le monde
    voilà je vous propose de jetter un coup d'oeil au programme suivant qui parcour un text donné:

    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
     
    def avance(S):
        i=0
        while True:
            Mot=''
            while not S[i].isalpha():
                i+=1
            while S[i].isalpha():
                Mot+=S[i]
                i+=1
            yield Mot        
     
     
    def  main():
        S= "bru-11-r6.car.belbone.be"
        A=avance(S)
        try:
            while True:
                print A.next()
        except IndexError:
            print "C'est fini"
     
    main()
    Question:
    1 - Lors de l'affichage il n'y a pas l'apparition des chiffre, comment faire pour y remédier.

    2 - Si je veux qu'à la place d'une petite phrase, faire la même démarche avec un document txt, comment s'y prendre??

    Merci d'avance

  2. #2
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    pour les chiffres tu a isdigit()
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Et bien tu te débrouilles pas mal d'après ce que je vois avec ton code.

    La discussion suivante devrait t'être pas mal utile
    http://www.developpez.net/forums/d73...vancer-chaine/

    Bon, il semble que tu veuille faire une analyse de texte "naturel", et non pas une analyse syntaxique informatique.

    Je n'aime pas trop les trucs liés au langage naturel, sauf quand c'est bien délimité, parce que c'est un champ aux frontières floues. Un langage inforamtique est quelque chose de fortement structuré et bien défini, une analyse syntaxique on voit comment la mener. Mais les questions de linguistiques, ça peut dériver à l'infini, il est susceptible de survenir des cas particuliers n'ayant pas été envisagé à n'importe quel moment. Un programme qui s'occupe d'une telle analyse est une marmite sur le feu, il faut toujours le surveiller.
    C'est l'idée que j'ai de ces choses, mais je ne suis pas un spécialiste.

    Sinon, à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while not S[i].isalpha():
    tu pourrais peut être utiliser à la place
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while S[i} not in [' ','"',',','-'...]
    etc et tout autre caractère que tu ne souhaites pas être considéré comme étant un caractère constituant des mots. Ce serait plus extensif à volonté. À toi de voir.

    Je pense aussi que tu ferais sans doute bien de te mettre à l'étude des expressions régulières car, s'il est vrai qu'il ne faut pas en devenir un maniaque et les utiliser à tout bout de champ même quand elles sont le moins justifiées, c'est un outil très utile, et dans certains cas incontournable, à mon avis.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    J'ai bien l'impression que tu as pompé ton code dans le lien que j'ai donné ensuite !
    Ce qui prouve qu'au moins tu as fait des recherches.

    Voici une solution qui n'a pas été donnée dans la discussion en question, enfin je crois, j'ai regardé rapidement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from string import maketrans
    chars = '-."'
    tab = maketrans(chars,len(chars)*' ')
     
    S= "bru-11-r6.car.belbone.be"
     
    ch = S.translate(tab)
    print ch
    print ch.split()
    Resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bru 11 r6 car belbone be
    ['bru', '11', 'r6', 'car', 'belbone', 'be']
    Dans maketrans(cha,chb) , les deux chaines de caractères cha et chb doivent avoir la même longueur.
    Au lieu d'écrire maketrans('-".',' ') j'ai écrit comme ci-dessus pour faciliter l'extension de chars sans avoir à penser à rajouter un blanc dans la seconde chaîne.

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Sinon, pour vérifier si un caractère est alphanumérique il y a la méthode isalnum()

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Par défaut
    Bonjour tout le monde,
    Je vois qu'il y a beaucoup de solutions concernant la distinction entre isalpha et isalnum,mais e vrai problème, c'est que je n'arrive pas à ouvrir le fichier "bru-11-r6.car.belbone.txt", je ne sais pas si c'est un problème d'emplacement du fichier ou autre.
    En tout cas durant ce week end, c'est ce que j'ai trouvé comme solution mais malgré ca ca ne marche pa, à vous de juger:

    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
    28
    29
    30
    31
     
    #!/usr/bin/python  
    # -*- coding: UTF-8 -*-   
     
    import re  
    import sys   
     
    def listeMot(ligne): 
         mot =["empty"] 
         mots = re.findall('\w*', ligne) #match tous les caractère alphanumérique consécutif 
         for mot in mots: 
              if mot == "":              #les match nul renvoi une chaine videjusqu au prochain  
              mots.remove(mot)           #match je les supprime donc ici 
         return mots 
     
    #exemple 
    motsLigne = listeMot("okdok oakzd?.azd23.diqjij") 
    for mot in motsLigne: 
         print mot 
     
     
    def main(): 
         mots =["code"]
         myFile = open("test.txt",'r')             #fichier situé dans le même dossier             
         for ligne in myFile:                      #que le script 
              mots.extend(listeMot(ligne))         #concaténation de chaques listes de mots  
         print "fini liste des mots : "         #recuperés 
         for mot in mots: 
              print mot 
     
    main()

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Par défaut
    Je viens de changer le chemin du fichier que je veux ouvrir, mais voilà ce que ca affiche :

    >>>
    okdok
    oakzd
    azd23
    diqjij


    Traceback (most recent call last):
    File "C:/Python23/Ouvrir un texte.py", line 30, in -toplevel-
    main()
    File "C:/Python23/Ouvrir un texte.py", line 22, in main
    mots =[code]
    NameError: global name 'code' is not defined



    Si quelqu'un pourrait trouver l'orogine du problème rapidement ca serait vraiment trs sympa

  8. #8
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Par défaut
    Ca y est j'y suis arrivé, j'ai résolu le problème.
    Merci à tous pour votre aide
    slt slt

    PS: il fallait supprimer mots[code] et mettre des [], car il ne reconnaissat pas la variable code, en plus j'ai redéfinies le chemin du fichier en question en remplacant '\' par '\\'

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Dans la fonction listeMot(ligne):
    - si tu as bien voulu écrire mot =["empty"] : à quoi sert cette définition puisque un peu plus loin mot devient du type chaîne dans la boucle for mot in mots?
    - si tu as voulu écrire mots =["empty"] : cette instruction est superflue. L'instruction mots = re.findall('\w*', ligne) crée la liste mots, elle ne fait pas que la remplir.




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        for mot in mots: 
            if mot == "":  
                mots.remove(mot)
        return mots
    peut être remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return [ mot for mot in mots if mot!=""]



    Ton code est l'occasion pour moi de découvrir quelque chose que je ne connaissais pas:
    avec une RE constituée de char* , où char représente 1 caractère quelle que soit la manière dont il est spécifié, on matche:
    - toute répétition du caractère char, * valant alors 'plusieurs'
    - tout caractère qui n'est pas char, y compris la blanc: * vaut alors 0, c'est pourquoi ça ne matche qu'un caractère et non pas une succession même s'il y a par exemple plussieurs blancs qui se succèdent

    Quand je dis "quelle que soit la manière dont il est spécifié", cela signifie qu'on peut avoir char* égal à :
    r* (n'importe quelle lettre)
    [aeiou]*
    [a-p]*
    [a-z0-7]*
    \w*
    \d*
    \D*
    \s*

    etc...

    Pour éviter ce comportement, il faut écrire ta RE: '\w+'




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def listeMot(ligne):
        mot =["empty"] 
        mots = re.findall('\w*', ligne) #match tous les caractère alphanumérique consécutif
        print mots
        for mot in mots: 
            if mot == "":              #les match nul renvoi une chaine videjusqu au prochain  
                mots.remove(mot)           #match je les supprime donc ici 
        return mots 
     
    #exemple 
    motsLigne = listeMot("okdok oakzd?.azd23.diqjij") 
    for mot in motsLigne: 
         print mot
    peut être abrégé en :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for mot in re.findall('\w*', "okdok oakzd?.azd23.diqjij") :
        print mot
    et ton code peut devenir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    import re
    mots = []
    myFile = open("test.txt",'r')
    for ligne in myFile:
         mots.extend(re.findall('\w+', ligne))
    myFile.close()
    print "fini liste des mots : "
    print '\n'.join(mots)
    Remarque le close() c'est mieux de ne pas l'oublier.
    Si tu écris ' '.join(mots) tu auras les mots sur une seule ligne séparés par des blancs.



    Tu as trouvé pour mot[code].
    Mais qu'elle était ton intention en écrivant cette instruction ?

  10. #10
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 50
    Par défaut
    Je sais qu'il y a des choses à ajouter mais voilà la version que j'ai finalement adopté:

    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
     
     
    # -*- coding: cp1252 -*-
     
     
    import re  
    import sys   
     
    def listeMot(ligne): 
         mot =["empty"] 
         mots = re.findall('\w*', ligne) #match tous les caractère alphanumérique consécutif 
         for mot in mots: 
              if mot == "":              #les match nul renvoi une chaine videjusqu au prochain  
                  mots.remove(mot)           #match je les supprime donc ici 
         return mots 
     
    def main(): 
         mots =[]
         myFile = open("C:\\Documents and Settings\\All Users\\bru-11-r6.car.belbone.rtf",'r')             #fichier situé dans le même dossier             
         for ligne in myFile:                      #que le script 
              mots.extend(listeMot(ligne))         #concaténation de chaques listes de mots  
         print "fini liste des mots : "         #recuperés 
         for mot in mots: 
              print mot 
     
    main()
    J'ai carrément enlever l'exemple car je n'en ai pas besoin, tout ce que je veux c'est ouvrir le fichier. Mais une fois ce fichier ouvert, je rencontre deux petits problèmes:

    1 - L'affichage du texte dans le fenetre interactive n'est pas le meme que celui dans le document d'origine. Par exemple les caractères come '\n' retour chariot est repris par '\par' puis retour à la ligne, en plus que la ponctuation ce n'est pas du tout ca, car à chaque fois qu'il rencontre des caractères spéciaux il reviens à la ligne, ce qui peux poser problème lors de la récupération des données.

    2 - Je ne suis pas un champions pour trier sr python, je voudrais une méthode efficace pour déterminer moi meme les mots que je veux afficher sur la fenetre interactive.

    Merci

Discussions similaires

  1. [WD15] ouverture fichier texte dans treeview
    Par kirikou84 dans le forum WinDev
    Réponses: 16
    Dernier message: 27/05/2011, 12h53
  2. [AC-2003] Ouverture fichier texte ENORME
    Par Kloun dans le forum VBA Access
    Réponses: 2
    Dernier message: 12/10/2009, 09h59
  3. ouverture fichier texte
    Par le_voisin dans le forum SL & STL
    Réponses: 1
    Dernier message: 05/01/2009, 17h44
  4. Réponses: 0
    Dernier message: 20/10/2008, 12h59
  5. problème ouverture fichier texte
    Par ice-t69 dans le forum Langage
    Réponses: 4
    Dernier message: 07/11/2005, 19h29

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