Chercher chaque valeur d’un fichier 1 das un fichier 2 et afficher les lignes

Fermé
Ben - 21 mars 2021 à 15:44
 Ben - 27 mars 2021 à 02:46
Bonjour,

J’ai un fichier 1 qui contient des codes d’identification sous forme:
6271815
1426282
9726262
5251161
Et un fichier 2 qui contient :
6271815 , Alexendre Legrand
1426282 , Phillipe Dumas
9726262 , Albert Einstein
5251161, Nicolas Tesla
1627286, Ben Aflek
1522772, Richard Jean
1272828, Céline Dion
.......
Je veux faire une recherche pour chaque valeur du fichier 1 dans le fichier 2 et si elle se trouve je fais imprimer la ligne du fichier 2 pour avoir le nom et le prénom et envoyer le tout dans fichier3.
J’ai fait deux boucles For imbriquées mais il me manque un traitement de string que je n’arrive pas à retrouver, voilà mon code :

# -*- coding: utf-8 -*-

fichier_analyser = open("../fichier2.txt", "r+")
with open("../fichier1.txt", "r") as f:
for line in f:
for l in fichier_analyser:
if "line" in "l":
print(l)

Toute aide est la bienvenue, je suis débutant avec python !
Merci a vous tous,

Configuration: iPhone / Chrome 79.0.3945.73
A voir également:

6 réponses

jee pee Messages postés 40504 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 30 novembre 2024 9 438
21 mars 2021 à 16:33
Bonjour,

Tout d'abord sur le forum, pour la mise en forme des sources, au dessus de la zone d'édition de tes messages, il y a des icônes pour l'enrichissement du texte. Celle qui a cet aspect
<> ▼
permet d'appliquer au code, suivant une liste de valeurs, le format correspondant à sa nature, et notamment en Python, la coloration et le respect de l'indentation.
Un petit tuto là : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Pour ton code une observation toute simple,
"line" et "l"
ce sont des chaines de caractères alors que
line et l
, ce sont des noms de variables.
0
Bonjour,
Merci pour ces indications, et désolé pour le non respect des normes, je corrige cela :


# -*- coding: utf-8 -*-

fichier_analyser = open("../fichier2.txt", "r+")
with open("../fichier1.txt", "r") as f:
       for line in f:
             for l in fichier_analyser:
                   if "line" in "l":
                       print(l)
</code>

pour les chaines de caractères je l'ai vu, mais je veux chercher le contenu de la variable ,et c'est là que je suis coincé, je ne sais pas comment tester cette variable qui change pour chaque tour de boucle !
0
jee pee Messages postés 40504 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 30 novembre 2024 9 438
21 mars 2021 à 17:50
Pour commencer, il faut bien que tu assimiles la différence entre une variable (et son contenu), et une chaine ....

"line" est une chaine de caractères (en dur) qui contient 4 caractères : l i n e
alors que line dans le code c'est une variable qui va contenir une valeur (dans ton cas issue d'une lecture fichier)

dans ton programme "line" (et "l") n'a pas de sens, avec ses guillemets c'est une chaine, c'est la variable line sans les guillements qui est à utiliser.

réfléchis bien sur cela, il y a 2, 3 trucs qu'il faut que je teste sur ton programme, je reviens après vers toi
0
effectivement j'ai fait une bourde :
tu veux dire que je doit mettre les variables:
# -*- coding: utf-8 -*-

fichier_analyser = open("../fichier2.txt", "r+")
with open("../fichier1.txt", "r") as f:
    for line in f:
        for l in fichier_analyser:
            if line in l:
                print(l)

mais cela ne me renvoi rien ni erreur ni résultat que je veux !!, j'aurai aimé trouver une fonction qui cherche genre: if cette sous chaine dans la chaine alors affiche la chaine , mais je ne trouve pas dans python ou bien je cherche mal
0
jee pee Messages postés 40504 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 30 novembre 2024 9 438
Modifié le 21 mars 2021 à 19:11
là on travaille sur les variables :-)

je vois plusieurs raisons à tes soucis
1/ la boucle l sur f2 ne va s’exécuter qu'une fois sur le 1er enregistrement de f1, car une fois le pointeur de lecture du fichier arrivé en fin, il ne redémarre pas au début, il faudrait à chaque fois fermer et ouvrir le fichier f2, ou plutôt charger les lignes de f2 au départ dans une liste
2/ tu travailles sur un fichier texte, et quand on lit la ligne, on récupère le caractère de fin de ligne \n, donc quand tu testes la comparaison c'est
if "6271815\n" in "6271815 , Alexendre Legrand\n"
==> NON, il faut donc à un moment donné, lecture ou comparaison, supprimer ce \n au moins dans line

voir ce code pour comprendre le point 1 (quand un programme ne fonctionne pas correctement il faut faire du debug, notamment des print parfois après chaque ligne pour voir le contenu des variables et où le programme passe) et corriger le point 2

fichier_analyser = open("../fichier2.txt", "r+")
with open("../fichier1.txt", "r") as f:
    for line in f:
        print("f1", line)
        for l in fichier_analyser:
            print("f2", l)
            if line.rstrip('\n') in l:
                print('ok *******',l)
0
Ben > jee pee Messages postés 40504 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 30 novembre 2024
22 mars 2021 à 04:44
Encore un grand merci pour ton aide jee pee,

J'ai cherché et je suis arrivé avec cette solution mais c'est des ensemble et je ne peux pas tester chaque élément mais plutôt tout un ensemble :
# -*- coding: utf-8 -*-
with open("./fichier1.txt", "r+") as src_fd:
            src_lines = src_fd.readlines()
with open("./fichier2.txt", "r+") as analysed_fd:
            analysed_lines = analysed_fd.readlines()
            matches = set(src_lines).intersection(analysed_lines)
          print("===============")
            for chaqueElement in matches:
                        print(chaqueElement.strip()+"\n")


je crois que je tourne au rond !!
0
jee pee Messages postés 40504 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 30 novembre 2024 9 438 > Ben
22 mars 2021 à 07:41
il ne faut pas tout chambouler, .intersection() si on cherche ce que cela fait, va rechercher les lignes identiques, pas qui contiennent une partie des caractères

si tu restes sur ta logique de départ tu peux faire
# -*- coding: utf-8 -*-
with open("./fichier1.txt", "r+") as src_fd:
    src_lines = src_fd.readlines()
with open("./fichier2.txt", "r+") as analysed_fd:
    analysed_lines = analysed_fd.readlines()
    for l1 in src_lines:
        for l2 in analysed_lines:
           if l1.rstrip('\n') in l2:
                print(l1,l2)
0
Ben > jee pee Messages postés 40504 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 30 novembre 2024
22 mars 2021 à 18:25
Ah t'as raison , j'étais mélangé car ma boucle ne passais pas à l'élément suivant,alors qu'il falait tester sur le \n :( , merci pour l'astuce jee pee :);
Par contre quand j'affiche l2, cela me renvois les ligne matchées mais aussi tout le contenu du f2 , alors que je veux juste les lignes matchés !

with open("./fichier2.txt", "r+") as src_fd:
    src_lines = src_fd.readlines()
with open("./fichier1.txt", "r+") as analysed_fd:
    analysed_lines = analysed_fd.readlines()
    for l1 in src_lines:
        for l2 in analysed_lines:
            if l1.rstrip('\n') in l2:
                print(l2) 
        print("--------- OK --------- ")
0
jee pee Messages postés 40504 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 30 novembre 2024 9 438 > Ben
Modifié le 22 mars 2021 à 18:31
c'est normal l2 contient toute la ligne, si tu veux le code, ou le nom il faut utiliser une fonction comme .spilt(), pour découper la ligne en plusieurs champs sur la virgule
0
sourcePresence3.tx contient :
6271815
1426282
1111111
9726262
5251161
2222222
3333333
4444444

Alayser.txt ceci :
6271815 , Alexendre Legrand
1426282 , Phillipe Dumas
9726262 , Albert Einstein
5251161, Nicolas Tesla
1627286, Ben Aflek
1522772, Richard Jean
1272828, Céline Dion
0

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

Posez votre question
jee pee Messages postés 40504 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 30 novembre 2024 9 438
25 mars 2021 à 10:38
Tu as 2 boucles imbriquées, tu ne peux pas, dans la boucle l2 savoir si l1 est trouvé,
tu ne peux le savoir qu'en fin d'analyse d'une occurrence l1, il faut alors par exemple gérer un drapeau qui va signaler qu'une concordance a été trouvée en l2
with open("./sourcePresence3.txt", "r+") as src_fd:
    src_lines = src_fd.readlines()
with open("./analyser.txt", "r+") as analysed_fd:
    analysed_lines = analysed_fd.readlines()
    print("DEBUT D'ANALYSE")
    for l1 in src_lines:
        print ('l1 =',l1.rstrip('\n'),end='')
        trouve = False
        for l2 in analysed_lines:
            if (l1.rstrip('\n') in l2)  :
                print(l2.split(',')[1].rstrip('\n'),"--------- OK --------- ")
                trouve = True
        if not trouve:
            print("--------- NOT EXIST --------- ")  

0
Merci pour l'astuce,
j'ai appris beaucoup de choses avec vous Jee Pee , un grand merci pour les explications ainsi que votre disponibilité , j'aimerai apprendre plus la programmation python ainsi PowerShell et Bash , vous n'auriez pas des sites , Forums bien structurés pour me former plus ?
0
jee pee Messages postés 40504 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 30 novembre 2024 9 438
26 mars 2021 à 22:45
je n'ai pas de site particulier à te proposer, moi même il faudra un jour que je la suive cette formation python ;-)

je ne suis pas dans la même situation que toi, informaticien expérimenté, je sais ce que je recherche, même dans un langage que je connais peu.
0
Ben > jee pee Messages postés 40504 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 30 novembre 2024
27 mars 2021 à 02:46
Il faut que je travaille beaucoup afin d’atteindre votre niveau d’expérience, merci pour tout et il se peut qu’on va se parler ???? sur ce site vue que je suis débutant et je veux apprendre.:)
0