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 :

Comment lire un fichier texte phrase par phrase


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 54
    Points : 70
    Points
    70
    Par défaut Comment lire un fichier texte phrase par phrase
    Coucou tous le monde
    alors voila mon probleme.
    Je voudrais ouvrir un fichier.txt et le parcourir. Je voudrais lire ce fichier phrase par phrase et non pas ligne par ligne comme on le fait avec la methode "readline".
    Je voudrais savoir si il existe une methode pour faire ça, car apres avoir pas mal chercher, je n'ai trouvé que la methode readline.

    Apres avoir ouvert ce fichier je voudrais en recuperé chaque phrase et les séparer par un caractere quelconque et ensuite recuperer chaque mot de chaque phrase pour les stoquer dans un autre fichier texte.
    Donc pour resumer mon fichier resultat doit contenir les phrases separé par un caratere quelconque et les mot doivent etre separé par un espace au sein de chaque phrase (les mot doit etre traité avant comme par exemple differencier "arc-en-ciel" qui est un seul mot de "mange-t-il" qui est fait de deux mots.
    La je fait la fonction qui permet a l'utilisateur de choisir lui meme lorsque le programme python rencontre un mot avec un tiré de dire si il s'agit d'un mot ou de plussieurs.
    Donc j'aurais aussi besoin de juste savoir comment on lit un texte phrase par phrase et aussi au passage comment on permet a l'utilisateur d'ecrire comme ça il dira de lui meme si il s'agit d'un seul mot ou de plusieurs et dans ce cas de taper les mots qui constitue le bloc separé par les tiré.

    Merci encore a ceux qui repondrons.
    Je pourrais mettre le code en ligne pour ceux que ça interesse comme ça pourra peut etre aider les autres debutants comme moi.

  2. #2
    Nouveau membre du Club
    Inscrit en
    Septembre 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 24
    Points : 26
    Points
    26
    Par défaut
    La fonction split() est ton ami!

    Bon voici des pistes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    # Obtenir une liste contenant les phrases
    f = open('tonfichier','r')
    contenu = f.read()
    f.close()
    # Le caractère discriminant est . dans ce cas
    liste_phrases = contenu.split('.')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    # Obtenir une liste contenant les mots
    for element in liste_phrases:
        # Tu découpes chaque phrases selon les espaces (' ')
        liste_mots = element.split(' ')
    Après dans la dernière boucle tu fais ce que tu veux.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 54
    Points : 70
    Points
    70
    Par défaut
    J'avais deja trouvé commen marchait la fonction "split" mais il y a un probleme.
    Comment differencier le point qui fini uen phrase, du point qui sert a metre fin a une abréviation ou un sigle (Mr. ou U.S.A) et les point de suspension. De plus il y aussi les point d'interrogation et d'exclamation.
    J'ai cherché une fonction comme split qui peut prendre plusieurs parametre, mais j'en est pas trouvé.
    Donc je me suis orienté vers les expression reguliere (\w, \[A-Z], ...) mais je doit avouer que j'arrive pas trop a comprendre commen marche c'est expression reguliere.

    En effet je voudrais en faire une plus complexe constitué de plusieur expression simple comme par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pour_decouper = \w+|[^\w\s]+'
    Je voudrais que mon expression decoupe le texte avec : ?, !, :, ;.
    pour ce qui est de differencier l'usage du point je fais une fonction pour ça, mais ce qui me manque c'est cette expression reguliere.

  4. #4
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    "Humainement" parlant, il est parfois difficile de savoir si dans un texte un point signifie la fin de la phrase... Par exemple dans "N.Y. USA", le point derrière le Y, suivi d'un espace et d'une majuscule pourrait signifier une fin de phrase. Avant de chercher comment le faire en python, il faudrait peut-être chercher comment le faire "humainement". Bonne chance.

    A+

    Pfeuh

  5. #5
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    +1

    Il est bien évident que le problème est dans la description du programme (ce qu'il fait) et non pas dans le codage. Dans aucun langage il ne peut y avoir une fonction built_in qui découpe un texte en phrase pour la simple raison que la "phrase" n'est pas reconnaissable en tant que telle par un ordinateur...

    Il faut donc commencer par poser le problème ("Ce qui se conçoit bien, s'énonce clairement etc., etc., ...) pour en tirer un algorithme.
    1ère question : comment se reconnaît une phrase ?
    => réponse : en français (restreignons le domaine de définition du problème) par une majuscule au début et un point à la fin.

    2ème question : Y a-t-il des cas ambigus ?

    => réponse : of course ! 1er cas : la majuscule peut affecter un nom à l'intérieur d'une phrase.
    2° cas : le point peut figurer en mileu de prase lui aussi : point numérique, points de suspension, etc. (il y a un point à "etc." !)
    Donc il faut lever les ambigüités si cela est possible.

    1) Il faut les 2 conditions (un ET logique) : majuscule au début et point à la fin.
    2) Pour la majuscule il faut pour qu'elle soit vraiment au début qu'elle soit précédée par un point ou par le début de texte
    3) Pour le point il faut qu'il soit suivi d'une majuscule ou de rien du tout (fin de texte).
    4) Une règle intéressante : en français le point est suivi d'un (on dit "une" en typographie) espace.

    Ces règles ne suffisent bien sûr pas comme le montre l'exemple cité dans le post précédent...

    Donc, ce débat a plus sa place dans la rubrique "algoritmique". Quel que soit le langage, il faut d'abord une feuille de papier et un crayon ...
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 54
    Points : 70
    Points
    70
    Par défaut J'avance petit a petit l'oiseau fait son nid......
    Coucou tous le monde, me revoila qui solicite a nouveau votre aide.
    J'ai rendu mon projet, j'ai pas mal avancé.
    J'aime telement le python, que j'ai decider de continuer mon projet tous seul pour mon plaisir.
    La j'ain petit probleme, je me demande si il existerait un moyen de supprimer les doublons (ou plus) dans liste, car je stock chaque mots du texte dans une liste et je ne veux garder que un seul exemplaire de chaque mot.
    Donc je me demande si il exiterait une fonction predefinis dans python qui reliserais cette tache oui alors si je doit la faire moi meme.
    Si vous avez des idees, n'esitais pas a les mentionner, j'en est quelques une, mais pour la plus part elle consiste en un certains nombre de boucle imbriqué ce qui complique la comprehension du code ou alors dans l'utilisation de plusieurs liste, mais je doit avouer que je ne trouve pas ça tres elegant.

  7. #7
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067

  8. #8
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    Un peu tard désolé ...

    Voici un exemple de fonction qui élimine les doublons sur une liste inconnue mais non vide (à tester avant donc si la liste peut éventuellement être vide par un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if len (ma_liste) == 0:
    )

    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
    #!/ usr/bin/python
    #-*- coding:Utf-8 -*-
    # elimination de doublons dans une liste / février 2007 / R. Maurel
     
     
     
    liste_depart =[1,2,3,4,1,5,1,6,1,8,7,2,8,5,9,5,4,8,9] #exemple de liste avec doublons
    liste_sans_doublon = [] 
     
    def elimine_doublon():
     
        if len(liste_sans_doublon)== 0:   # test pour créer le 1er elt dans la liste résultat
                liste_sans_doublon.append(liste_depart[0])
        for elt_courant in liste_depart:
            ajout= 1
            for elt_liste in liste_sans_doublon:
                    if elt_courant == elt_liste:
                        ajout = 0
            if ajout==1:
                liste_sans_doublon.append(elt_courant)
     
     
    elimine_doublon()    #test fonction
    print liste_depart   # affichage des résultats
    print liste_sans_doublon
    On peut aussi (facilement) ne garder QUE le éléments non-doublonnés de la liste d'origine ou que les éléments qui étaient doublonnés (mais sans qu'ils le soient dans la liste d'arrivée).

    Bref on peut faire beaucoup de choses
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  9. #9
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Salut,

    C'est quand même plus simple de passer par un ensemble:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    liste_sans_doublon = list(set(liste_depart))
     
    # ou avec une fonction
     
    def elimine_doublons(ma_liste):
        return list(set(ma_liste))
     
    liste_sans_doublon = elimine_doublons(liste_depart)
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  10. #10
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    Bonsoir,


    C'est vrai mais dans ce cas comment tu adaptes ton code pour ne garder dans la liste résultat que les valeurs non doublonnées de la liste de départ (ex liste_Depart =[1,2,1,2,3,4,5,6,5,6,7,8,9,8,9,] devient liste_resultat = [3,4,7]) ?

    Est-ce possible avec les ensembles (que je connais mal je l'avoue) ?
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  11. #11
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Citation Envoyé par richard
    Bonsoir,


    C'est vrai mais dans ce cas comment tu adaptes ton code pour ne garder dans la liste résultat que les valeurs non doublonnées de la liste de départ (ex liste_Depart =[1,2,1,2,3,4,5,6,5,6,7,8,9,8,9,] devient liste_resultat = [3,4,7]) ?

    Est-ce possible avec les ensembles (que je connais mal je l'avoue) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a = [1,2,1,2,3,4,5,6,5,6,7,8,9,8,9]
    b = [i for i in set(a) if a.count(i)==1]

  12. #12
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    Bonsoir,

    Je viens de tester ton code, il marche à la perfection ! je suis soufflé par la puissance et la concision de ces méthodes de listes!
    Je dois dire que j'ai toujours le défaut d'adapter mes scripts Python du Pascal qui est le langage que j'ai le plus utilisé et que j'utilise encore...

    Merci pour cette nouvelle piste !
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  13. #13
    Membre régulier Avatar de csbilouze
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 79
    Points : 107
    Points
    107
    Par défaut
    salut a tous et a richard

    j avais une simple question de debutant a propos de la lecture des fichiers.
    N est il pas possible par exemle d insérer entre chaque phrase, une sorte de tag personnel ( _endPhrase_ par exemple) _endPrase_ serait placer a la fin de toutes chaines de caracteres avant d etre envoyer au fichier. il suffirai de recuperer ce tag de fin de phrase pour que le programme sache que c'est bien une fin de phrase et pas d une ligne...

    qu en pensez vous?

  14. #14
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    Salut,

    Bienvenue

    Bien sûr c'est la solution idéale mais il faut pour cela que le fichier ait préalablement été découpé en phrase par un opérateur humain, dans ce cas c'est juste une relecture effectiviement.

    Pour faire de la reconnaissance de phrase on est plus dans la ligne de l'I.A que d'une programmation classique, ... à moins que Python ait une méthode de liste qui fasse le découpage par phrase mais là, non quand même, je ne pense pas !
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/06/2011, 12h13
  2. [Débutant] Comment lire un fichier texte de chiffres ?
    Par Bibifloch dans le forum Débuter
    Réponses: 3
    Dernier message: 29/09/2007, 21h29
  3. Comment lire un fichier texte
    Par toutounesan dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 20/08/2007, 10h20
  4. Réponses: 3
    Dernier message: 22/01/2007, 10h38
  5. Lire un fichier texte ligne par ligne
    Par LeLaid dans le forum Access
    Réponses: 7
    Dernier message: 05/12/2006, 16h05

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