Mots en commun entre 10 fichiers .txt

Résolu
CarlosMedina -  
jee pee Messages postés 31964 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
Je suis pas programmeur Python et j'aimerais avoir de l'aide pour un petit script.
Voila, j'ai 10 fichiers .txt dans un même répertoire et j'aimerais trouver les mots en commun entre ces 10 fichiers.
J'ai trouvé un code sur youtube mais ça ne marche que pour 2 fichiers

le code que j'ai modifié, moche je l'admet ;)
f1 = open("1.txt", 'r')
f2 = open("2.txt", 'r')
f3 = open("3.txt", 'r')
f4 = open("4.txt", 'r')
f5 = open("5.txt", 'r')
f6 = open("6.txt", 'r')
f7 = open("7.txt", 'r')
f8 = open("8.txt", 'r')
f9 = open("9.txt", 'r')
f10 = open("10.txt", 'r')

content1 = f1.read()
content2 = f2.read()
content3 = f3.read()
content4 = f4.read()
content5 = f5.read()
content6 = f6.read()
content7 = f7.read()
content8 = f8.read()
content9 = f9.read()
content10 = f10.read()

liste1 = content1.split()
liste2 = content1.split()
liste3 = content1.split()
liste4 = content1.split()
liste5 = content1.split()
liste6 = content1.split()
liste7 = content1.split()
liste8 = content1.split()
liste9 = content1.split()
liste10 = content1.split()

f1.close()
f2.close()
f3.close()
f4.close()
f5.close()
f6.close()
f7.close()
f8.close()
f9.close()
f10.close()

listeMotsCommuns=[]
for mot in liste1:
        if mot in liste2 and mot not in listeMotsCommuns:
            listeMotsCommuns.append(mot)
            print(listeMotsCommuns)

6 réponses

  1. CarlosMedina
     
    Grand Grand Grand Merci M3NSONG3 pour ton aide, ta spontanéité et ta patience.
    Ça marche parfaitement.
    1
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour,
    peux-tu préciser "python" quand tu utilises les balises de code?
    avant de programmer, je suggère que tu réfléchisses à quelle méthode tu choisis d'utiliser pour résoudre ce problème.
    décris-nous cette méthode.
    0
  3. CarlosMedina
     
    Salut,
    1- Je prends le premier mot de 1.txt [ liste1 = content1.split() ]

    2- je teste s'il existe dans 2.txt [ liste2 = content2.split() ]

    3- si oui, est-il déjà dans la listeMotsCommuns=[] sinon je le rajoute

    4- je vais en 1- en passant au 2eme mot

    5- fin de fichier 2.txt je passe à 3.txt (ainsi de suite jusqu'à 10.txt)

    6- j'écris ma listeMotsCommuns=[] dans fichier output.txt
    0
  4. jee pee Messages postés 31964 Date d'inscription   Statut Modérateur Dernière intervention   10 010
     
    Bonjour,

    Ton programme fonctionne bien avec en dur 2 fichiers.

    Avec 10 il faut comparer :
    liste1 à liste2 à 10
    liste2 à liste3 à 10
    ..
    liste9 à liste10

    On voit alors qu'il faut 2 boucles imbriquées. Et pour ne pas avoir à traiter des noms de liste en dur, il semble que charger les données initiales dans une liste 2D pourrait se prêter à la génération des 2 boucles.

    Cette liste 2D serait du genre listeMot=
     [['11111', 'AZZZ'], ['22222', 'aaaaa', 'bbbbb', 'cccc'], ['3333', 'TFTFT', 'aaaaa', 'DDDD', 'EEEE'], ['444444444', 'FFFFFFFFFFFF', 'PP', 'zzz'], ['55555', 'VVVVVVVV', 'RRRRR'], ['66666', 'BBB', 'JJJ', 'KKK', 'DDDD', 'EEE'], ['777', 'UUUU', 'I', 'III', 'O'], ['8888', 'OOOOO', 'PP', 'LLLLL', 'EEE'], ['999999', 'aaa', 'bbbb', 'ccc', 'DDDD', 'EEE', 'aaaaa', 'bbbbb', 'cccc', 'KLKLKL'], ['KLKLKL', 'FTFT', 'TFTFT', '100000000', 'FFFFFFFFFFFF']] 


    ps : j'ai changé ta balise code en code python dans la question

    0
    1. CarlosMedina
       
      Merci Jee Pee
      En fait le résultat que je recherche est le suivant:
      Créer un Dico des mots en commun entre ces 10 documents.
      Un mot, pour faire partie du Dico doit être présent dans les 10 documents txt sinon il est rejeté.
      0
      1. jee pee Messages postés 31964 Date d'inscription   Statut Modérateur Dernière intervention   10 010 > CarlosMedina
         
        pas clair "Un mot, pour faire partie du Dico doit être présent dans les 10 documents" ce serait alors tous les mots de tous les fichiers, ou un mot présent dans chacun des 10 fichiers, ou encore un mot présent dans au moins 2 ?
        0
      2. CarlosMedina > jee pee Messages postés 31964 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Présent dans 10 en même temps.
        0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      plutôt que de faire deux boucles imbriquées, je créerais une liste avec le contenu du premier fichier, et, pour chacun des autres fichiers, j'éliminerais de cette liste les entrées non présentes dans le fichier.
      0
      1. jee pee Messages postés 31964 Date d'inscription   Statut Modérateur Dernière intervention   10 010 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
         
        La plus grande difficulté des questions, ce n'est pas toujours le code, mais la question elle même. Là j'étais sur au moins 2 fois dans l'un des 10 fichiers, Effectivement dans les 10, l’exclusion s'impose plus.
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. M3NSONG3 Messages postés 670 Statut Membre 162
     
    Ok... Bon si on résume.

    tu dois lire le contenu de chaque fichier... et enregistrer chaque mot dans une liste. Ensuite tu dois trouver les mots présents dans ces 10 mêmes listes. Bon bah y'a plus qu'à faire ça :
    files_content = []
    
    # On lit chaque fichiers :
    for i in range(1, 11):
        with open(f"{i}.txt", "r") as file:
            files_content.append(file.read().split())
    
    common = set.intersection(*map(set,files_content))


    Bon courage pour la suite ;) Si besoin je continue de suivre le sujet si tu ne comprends pas mon code...
    (Common est une liste avec les mots en commun de tous les fichiers 1.txt, 2.txt [...] 10.txt)

    0
    1. CarlosMedina
       
      Merci beaucoup M3NSONG3.
      je viens juste de le tester.
      J'ai marqué tous les fichiers avec cette chaîne de caractères (zzzzzzzzzzz6) mais il ne la trouve alors qu'elle est présente partout.
      0
      1. M3NSONG3 Messages postés 670 Statut Membre 162 > CarlosMedina
         
        Elle est bien séparée du reste par des espaces ? J'ai compris qu'on cherchait des mots (donc séparés par des espaces ou des sauts de ligne).
        J'ai beau essayé de mettre ta chaine dans tous les sens dans mes fichiers testes... Cela marche.

        Peux-tu me montrer comment tu as implémenter mon code et me montrer les fichiers que tu essayes de lire pour voir un peu la structure qu'ils ont ? (Au moins un extrait représentatif)
        0
  7. CarlosMedina
     
    L'un de mes textes:

    accueil
    accueil>
    accès
    afin
    agence
    ancestraux.
    ancien
    anciennes
    années
    ans
    appartenant
    architecture
    aristocrates
    articles
    aspects
    atmosphère
    attestent
    au
    authentiques
    autour
    avec
    bien
    boutique-hôtel
    catalogue
    ce
    central
    ces
    cette
    chacune
    chambres
    chambres:
    charme
    chic
    ci-dessous
    comment
    confidentialité
    constituent
    constituer
    contacter
    contacts
    correspondant
    célèbres
    cœur
    dans
    datent
    de
    demeures
    depuis
    derrière
    des
    design
    dix-sept
    donc
    découvrir
    désormais
    développement
    d’hotes
    d’hôtels
    d’hôtes
    d’immobilier
    d’investissement
    d’un
    d’une
    el
    email:
    emblématique
    en
    encore
    enthousiasme
    envoûtante
    essaouira
    est
    et
    exceptionnel
    exploité
    exploré
    exquis
    face
    faire
    fait
    figurent
    fr
    genre
    gsm:
    haut
    havres
    historique.
    hôtel
    ils
    immobilier
    immobilière
    immobilière
    immédiat
    jardin
    jardins
    jemaa
    la
    labyrinthe
    le
    les
    lieux
    luxe
    luxueuses
    luxuriant
    légendaires
    l’un
    l’époque
    m
    m2
    magiques
    magnifique
    magnifiques
    maison
    marché.
    mode

    médina
    navigation
    ne
    non
    notre
    nous
    occupants
    opportunités
    organisées

    page
    paix
    palais
    par
    pas
    passion
    patio
    patriciennes
    place
    plus
    pour
    probablement
    propos
    propriété
    propriétés
    proximité
    présentant
    quatre
    qui
    qu’ils
    raffinée
    raisons
    rare
    ravis
    recevoir
    recherche
    restauré
    rouge
    ruelles
    référence
    rénovation
    rénover
    rénover
    rénové
    rénovées
    rénovés
    résidentiel
    sa
    savoir-faire
    service
    ses
    site
    sites
    soigneusement
    soin
    sol
    sold
    sommes
    son
    sont
    spectaculaire
    succès
    suites
    suivante
    superbe
    sur
    séduit
    sélection
    sélectionnées
    traditionnelle
    trépidante.
    témoignages
    témoins
    un
    une
    unique
    vaste
    vastes
    vendre
    vendre
    vente
    veuillez
    vie
    vieille
    villas
    ville
    vingt-six
    votre
    vous
    véhicules
    zzzzzzzzzzz6
    à
    élément
    érigée
    étroites
    été
    être


    Comment j'ai implémenté votre code:

    f1 = open("1.txt", 'r')
    f2 = open("2.txt", 'r')
    f3 = open("3.txt", 'r')
    f4 = open("4.txt", 'r')
    f5 = open("5.txt", 'r')
    f6 = open("6.txt", 'r')
    f7 = open("7.txt", 'r')
    f8 = open("8.txt", 'r')
    f9 = open("9.txt", 'r')
    f10 = open("10.txt", 'r')
    
    content1 = f1.read()
    content2 = f2.read()
    content3 = f3.read()
    content4 = f4.read()
    content5 = f5.read()
    content6 = f6.read()
    content7 = f7.read()
    content8 = f8.read()
    content9 = f9.read()
    content10 = f10.read()
    
    liste1 = content1.split()
    liste2 = content1.split()
    liste3 = content1.split()
    liste4 = content1.split()
    liste5 = content1.split()
    liste6 = content1.split()
    liste7 = content1.split()
    liste8 = content1.split()
    liste9 = content1.split()
    liste10 = content1.split()
    
    f1.close()
    f2.close()
    f3.close()
    f4.close()
    f5.close()
    f6.close()
    f7.close()
    f8.close()
    f9.close()
    f10.close()
    
    		
    files_content = []
    
    # On lit chaque fichiers :
    for i in range(1, 11):
        with open(f"{i}.txt", "r") as file:
            files_content.append(file.read().split())
    
    common = set.intersection(*map(set,files_content))
    print (common)
    
    0
    1. M3NSONG3 Messages postés 670 Statut Membre 162
       
      Pour le coup, le contenu avant mon code ne sert pas à grand chose...
      Juste mon code suffira !

      Par contre je ne comprends pas... J'ai beau testé avec ton fichier et en refaire des autres de la même façons, de mon côté ça marche très bien...
      Essaye peut-être d'ouvrir les fichiers en utf-8 en modifiant cette ligne :
       with open(f"{i}.txt", "r", encoding="utf-8") as file:


      Faire un fichier comme celui-ci suffira pour ce que tu veux faire, ton code d'avant n'est pas utile :
      #!/usr/bin/env python
      files_content = []
      
      for i in range(1, 4):
          with open(f"{i}.txt", "r", encoding="utf-8") as file:
              files_content.append(file.read().split())
      
      common = set.intersection(*map(set, files_content))
      print(common)
      0