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

Signaler
-
 Ben -
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

6 réponses

Messages postés
31488
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
8 avril 2021
7 537
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.
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 !
Messages postés
31488
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
8 avril 2021
7 537
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
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
>
Messages postés
31488
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
8 avril 2021

je viens de faire le split mais idem il prend le fichier entier
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()
    for l1 in src_lines:
        for l2 in analysed_lines:
            if l1.rstrip('\n') in l2:
                print(l2.split(',')[0])
        print("--------- OK --------- ")
Messages postés
31488
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
8 avril 2021
7 537 > Ben
ton programme ne donne pas le fichier en entier,

il donne toutes les lignes de f1 qui ont une correspondance dans F2 (c'est à dire toutes !), c'est ton référentiel de test qu'il faut changer, rajouter des lignes dans f1 qui n'existent pas dans f2
>
Messages postés
31488
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
8 avril 2021

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()
    for l1 in src_lines:
        for l2 in analysed_lines:
            if (l1.rstrip('\n') in l2) and (l1 in l2) :
                print(l2.split(',')[0])
        print("--------- OK --------- ")


il me faut une deuxième condition dans mon IF mais il m'affiche toujours le fichier entier
Messages postés
31488
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
8 avril 2021
7 537 > Ben
tu devrais plutôt tester ça, moi avec 6 lignes en l1 il n'en matche que 4

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()
    for l1 in src_lines:
        print ('l1 analysé =',l1)
        for l2 in analysed_lines:
            if (l1.rstrip('\n') in l2)  :
                print(l2.split(',')[0],"--------- OK --------- ")


l1 analysé = 6271815

6271815 --------- OK ---------
l1 analysé = 3426282

l1 analysé = 6A271815

l1 analysé = 1426282

1426282 --------- OK ---------
l1 analysé = 9726262

9726262 --------- OK ---------
l1 analysé = 5251161

5251161 --------- OK ---------
>
Messages postés
31488
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
8 avril 2021

Je te remercie infiniment jee pee pour ta disponibilité et ton aide qui m'a été d'une grande utilité, mon if l1.rstrip('\n') in l2: il l'a fallut les parenthèse et effectivement cela match le ligne existante , je veux ajouter un ELSE pour la ligne qui n'est pas retrouvé dans le fichier 2 cela me donne cela:
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 analysé =',l1)
        for l2 in analysed_lines:
            if (l1.rstrip('\n') in l2)  :
                print(l2.split(',')[1],"--------- OK --------- ")
            else :
                if (l1.rstrip('\n') not in l2)  :
                    print("--------- NOT EXIST --------- ")  

j'ai placé le else dans diffèrent endroit mais cela n'est pas comme java !!!c'est comme s'il le boucle aussi !
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
Messages postés
31488
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
8 avril 2021
7 537
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 --------- ")  

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 ?
Messages postés
31488
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
8 avril 2021
7 537
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.
>
Messages postés
31488
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
8 avril 2021

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.:)