Mots en commun entre 10 fichiers .txt

Résolu/Fermé
CarlosMedina - Modifié le 12 juil. 2020 à 16:25
jee pee Messages postés 35898 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 29 septembre 2022 - 12 juil. 2020 à 19:44
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

CarlosMedina
12 juil. 2020 à 19:13
Grand Grand Grand Merci M3NSONG3 pour ton aide, ta spontanéité et ta patience.
Ça marche parfaitement.
1
yg_be Messages postés 20294 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 septembre 2022 1 225
12 juil. 2020 à 08:28
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
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
jee pee Messages postés 35898 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 29 septembre 2022 8 829
Modifié le 12 juil. 2020 à 16:26
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
CarlosMedina
12 juil. 2020 à 17:15
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
jee pee Messages postés 35898 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 29 septembre 2022 8 829 > CarlosMedina
Modifié le 12 juil. 2020 à 17:34
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
CarlosMedina > jee pee Messages postés 35898 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 29 septembre 2022
12 juil. 2020 à 18:01
Présent dans 10 en même temps.
0
yg_be Messages postés 20294 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 septembre 2022 1 225
12 juil. 2020 à 19:30
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
jee pee Messages postés 35898 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 29 septembre 2022 8 829 > yg_be Messages postés 20294 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 septembre 2022
12 juil. 2020 à 19:44
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
M3NSONG3 Messages postés 605 Date d'inscription mardi 16 avril 2013 Statut Membre Dernière intervention 4 novembre 2021 164
Modifié le 12 juil. 2020 à 17:43
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
CarlosMedina
12 juil. 2020 à 18:25
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
M3NSONG3 Messages postés 605 Date d'inscription mardi 16 avril 2013 Statut Membre Dernière intervention 4 novembre 2021 164 > CarlosMedina
12 juil. 2020 à 18:29
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
CarlosMedina
12 juil. 2020 à 18:48
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
M3NSONG3 Messages postés 605 Date d'inscription mardi 16 avril 2013 Statut Membre Dernière intervention 4 novembre 2021 164
12 juil. 2020 à 18:57
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