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 :

Calculer le nombre de fois où un mot apparaît dans chaque "document" d'un fichier texte


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Calculer le nombre de fois où un mot apparaît dans chaque "document" d'un fichier texte
    Bonjour,
    j'ai un fichier texte et je cherche à créer une fonction qui, quand on lui donne un nom de fichier et un mot, renvoie le nombre de "documents" dans lequel le mot apparaît (sachant que dans mon fichier texte chaque "document" est séparé par un retour à la ligne tout seul sur une ligne).

    Voici le code que j'ai fait :

    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
    def calcul_nombre_doc(fichier,mot):
        mot = mot.lower()
        mot = mot.strip()
        f = open(fichier, mode = "r")
        ligne = "initialisation"
        nombre_doc = 0
        while (ligne != ""):
            dans_doc = False
            while ((ligne != "\n") and (dans_doc == False)) :
                ligne = f.readline()                    
                if mot in ligne :
                    dans_doc = True
            if dans_doc :
                nombre_doc = nombre_doc+1
        f.close()
        return nombre_doc
    Il doit y avoir un problème au niveau des conditions d'arrêts de mes boucles while, parce que ma fonction ne s'arrête jamais...

    Merci d'avance pour vos réponses.

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 804
    Points : 7 080
    Points
    7 080
    Par défaut
    Il n'y a pas suffisamment de précision quand au contenu du fichier. Y a-t-il de la ponctuation par exemple ?

    Si on fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    with open(fichier, 'r') as f:
        for lines in f.splitlines():
            print(lines)
    ça donne bien une liste de tous les documents ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Non, il n'y a pas de ponctuation à l'intérieur du fichier, seulement des lettres minuscules et des chiffres (en plus des espaces et des retours à la ligne).

    En effectuant votre code, j'obtiens l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "<pyshell#7>", line 2, in <module>
        for lines in f.splitlines():
    AttributeError: '_io.TextIOWrapper' object has no attribute 'splitlines'

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 804
    Points : 7 080
    Points
    7 080
    Par défaut
    Oups

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    with open(fichier, 'r') as f:
        for lines in f.read().splitlines():
            print(lines)
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Cela affiche tous les documents séparés par deux saut de lignes les uns des autres.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    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 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Salut,

    Citation Envoyé par RussellUp Voir le message
    Il doit y avoir un problème au niveau des conditions d'arrêts de mes boucles while, parce que ma fonction ne s'arrête jamais...
    Un print(line) juste après la ligne 10 afficherait assez vite un tas de lignes vides (qui correspond à la fin du fichier).
    Ce qui vous met dedans, c'est que vous testez çà dans la boucle englobante (ou externe) alors qu'il faut tester çà juste après le .readline, histoire de savoir qu'il y a vraiment des données à traiter.

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

  7. #7
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 804
    Points : 7 080
    Points
    7 080
    Par défaut
    Citation Envoyé par RussellUp Voir le message
    Cela affiche tous les documents séparés par deux saut de lignes les uns des autres.
    Très bien, cela doit vous donner une idée pour traiter chaque texte maintenant.

    Pour savoir si un mot est dans un texte, on peut utiliser l'opérateur in.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if mot in text:
        # mot est dans le texte et dans le document ...
    Attention tout de même au piège avec in.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> s = "bonjour tous"
    >>> 'jour' in s
    True
    C'est pas ce qu'on attend...

    Si tu sais que tout tes mots sont séparés d'un espace, tu peux toujours faire une recherche avec eux.

    Cependant d'autres exceptions risquent d'arriver, surtout en début de phrase...

    Bref je te laisse étudier les différentes possibilités. À voir aussi la possibilité d'utiliser les expressions régulières si tu commences à avoir pas mal de cas particuliers.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    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 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Citation Envoyé par RussellUp Voir le message
    Cela affiche tous les documents séparés par deux saut de lignes les uns des autres.
    Si vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    with open(fichier, 'r') as f:
        for lines in f.read().splitlines():
            print(lines)
    cela ne fait qu'afficher des lignes.
    Il faut travailler un peu plus pour regrouper ces lignes en "documents".
    De même que rechercher un mot dans un document, c'est peut être aussi découper le documents en une séquence de mots (plutôt que de travailler sur la séquence de caractères brute de fonderie).
    Cela suggère la création de deux fonctions get_documents(fichier) qui retourne une liste de documents et get_mots(document) qui retourne une liste de mots pour écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for document in get_documents(fichier):
         for mots in get_mots(document):
              if mot in mots:
                 ....
    On y retrouve bien 2 boucles imbriquées mais elles sont "alignées" sur les informations à retrouver (documents / mots) dans le contenu du fichier.
    nota, get_mots se réduit à une instruction: document.split(). Créer une fonction pour çà peut paraître inutile mais çà rend le code plus lisible.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/04/2017, 13h59
  2. le nombre de fois ou un mot existe dans une ligne
    Par mohammed.badre dans le forum Débuter
    Réponses: 4
    Dernier message: 23/11/2011, 12h10
  3. Réponses: 4
    Dernier message: 06/12/2007, 16h46
  4. Réponses: 5
    Dernier message: 11/09/2007, 17h15
  5. Réponses: 1
    Dernier message: 01/05/2007, 10h39

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