Mots en commun entre 10 fichiers .txt [Résolu]

Signaler
-
Messages postés
29820
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
18 octobre 2020
-
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


Grand Grand Grand Merci M3NSONG3 pour ton aide, ta spontanéité et ta patience.
Ça marche parfaitement.
Messages postés
12660
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
18 octobre 2020
703
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.
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
Messages postés
29820
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
18 octobre 2020
6 843
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


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é.
Messages postés
29820
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
18 octobre 2020
6 843 > 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 ?
>
Messages postés
29820
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
18 octobre 2020

Présent dans 10 en même temps.
Messages postés
12660
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
18 octobre 2020
703
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.
Messages postés
29820
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
18 octobre 2020
6 843 >
Messages postés
12660
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
18 octobre 2020

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.
Messages postés
548
Date d'inscription
mardi 16 avril 2013
Statut
Membre
Dernière intervention
13 juillet 2020
111
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)


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.
Messages postés
548
Date d'inscription
mardi 16 avril 2013
Statut
Membre
Dernière intervention
13 juillet 2020
111 > 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)

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)
Messages postés
548
Date d'inscription
mardi 16 avril 2013
Statut
Membre
Dernière intervention
13 juillet 2020
111
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)