3 votes

lire des mots dans un fichier et supprimer les lignes qui les contiennent dans un autre fichier

Je veux écrire un script qui lit chaque ligne de fichier 1 qui est une chaîne de mots, recherche il est à l'intérieur fichier2 et les lignes de fichier2 qui ne contient pas les mots, sont écrits dans un nouveau fichier. Exemple :

fichier 1

good
bad

fichier2

Hi,
I am a bad man
Trying to be a good one.
Bye.

Résultat(fichier3)

Hi
Bye.

C'est ma tentative :

with open("file1.txt", 'r') as f1:
    for line1 in f1:
        f1_line = line1.rstrip()

        with open("file2.txt") as f2:
            for line2 in f2:
                f2_line = line2.rstrip()

                if f1_line not in f2_line:
                    with open("file3.txt", 'a') as f3:
                        f3.write(f2_line + '\n')

Je ne sais pas ce que je fais de mal, mais le résultat est trop éloigné.

Ma logique est la suivante : Je lis la première ligne du fichier1, puis j'ouvre chaque ligne du fichier2. Si la ligne du fichier 1 n'est pas à l'intérieur de la ligne du fichier 2, alors j'écris la ligne du fichier 2 dans un nouveau fichier, et je continue avec le mot suivant.

5voto

Pranav Hosangadi Points 5045

D'abord, lisez les mots recherchés dans une liste.

with open("file1.txt") as f1:
    wordslist = [line.strip() for line in f1]

Maintenant, wordslist est ['good', 'bad']

Ensuite, lisez le fichier2 ligne par ligne, et vérifiez si la ligne contient tout les mots que vous lisez dans wordslist :

with open("file2.txt") as f2, open("file3.txt", "w") as f3:
    for line in f2:
        if not any(word in line for word in wordslist):
            f3.write(line)

Le fichier 3 contient maintenant :

Hi,
Bye.

5voto

martineau Points 21665

Vous pouvez le faire en profitant de l'option else clause qui for ont (voir documentation ) qui sera exécuté si un break La déclaration est no exécuté pendant les itérations du corps de la boucle. Cela permet de déterminer facilement si des mots du premier fichier ont été trouvés (sans utiliser un drapeau "found" ou quelque chose de similaire).

with open("file2.txt", 'r') as f2, open("file3.txt", 'w') as f3:
    for line2 in f2:
        f2_line = line2.rstrip()

        with open("file1.txt", 'r') as f1:
            for line1 in f1:
                f1_line = line1.rstrip()
                if f1_line in f2_line:
                    break
            else:  # None found.
                f3.write(f2_line + '\n')

print('fini')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X