web-dev-qa-db-fra.com

Supprimer les lignes contenant une certaine chaîne

J'essaie de lire un texte à partir d'un fichier texte, de lire des lignes, de supprimer des lignes qui contiennent une chaîne spécifique (dans ce cas, "bad" et "naughty"). Le code que j'ai écrit se présente comme suit:

infile = file('./oldfile.txt')

newopen = open('./newfile.txt', 'w')
for line in infile :

    if 'bad' in line:
        line = line.replace('.' , '')
    if 'naughty' in line:
        line = line.replace('.', '')
    else:
        newopen.write(line)

newopen.close()

J'ai écrit comme ça mais ça ne marche pas.

Une chose importante est, si le contenu du texte était comme ceci:

good baby
bad boy
good boy
normal boy

Je ne veux pas que la sortie ait des lignes vides. donc pas comme:

good baby

good boy
normal boy

mais comme ça:

good baby
good boy
normal boy

Que dois-je modifier à partir de mon code ci-dessus?

19
H.Choi

Vous pouvez rendre votre code plus simple et plus lisible comme celui-ci

bad_words = ['bad', 'naughty']

with open('oldfile.txt') as oldfile, open('newfile.txt', 'w') as newfile:
    for line in oldfile:
        if not any(bad_Word in line for bad_Word in bad_words):
            newfile.write(line)

en utilisant un Context Manager et any .

52
sloth

Vous ne pouvez tout simplement pas inclure la ligne dans le nouveau fichier au lieu de remplacer.

for line in infile :
     if 'bad' not in line and 'naughty' not in line:
            newopen.write(line)
5
Maksim Skurydzin

Je l'ai utilisé pour supprimer les mots indésirables des fichiers texte:

bad_words = ['abc', 'def', 'ghi', 'jkl']

with open('List of words.txt') as badfile, open('Clean list of words.txt', 'w') as cleanfile:
    for line in badfile:
        clean = True
        for Word in bad_words:
            if Word in line:
                clean = False
        if clean == True:
            cleanfile.write(line)

Ou pour faire de même pour tous les fichiers d'un répertoire:

import os

bad_words = ['abc', 'def', 'ghi', 'jkl']

for root, dirs, files in os.walk(".", topdown = True):
    for file in files:
        if '.txt' in file:
            with open(file) as filename, open('clean '+file, 'w') as cleanfile:
                for line in filename:
                    clean = True
                    for Word in bad_words:
                        if Word in line:
                            clean = False
                    if clean == True:
                        cleanfile.write(line)

Je suis sûr qu'il doit y avoir une façon plus élégante de le faire, mais cela a fait ce que je voulais.

5
Alistair

else est uniquement connecté au dernier if. Vous voulez Elif:

if 'bad' in line:
    pass
Elif 'naughty' in line:
    pass
else:
    newopen.write(line)

Notez également que j'ai supprimé la substitution de ligne, car vous n'écrivez pas ces lignes de toute façon.

2

Aujourd'hui, j'avais besoin d'accomplir une tâche similaire, j'ai donc rédigé un Gist pour accomplir la tâche sur la base de certaines recherches que j'ai faites. J'espère que quelqu'un trouvera cela utile!

import os

os.system('cls' if os.name == 'nt' else 'clear')

oldfile = raw_input('{*} Enter the file (with extension) you would like to strip domains from: ')
newfile = raw_input('{*} Enter the name of the file (with extension) you would like me to save: ')

emailDomains = ['windstream.net', 'mail.com', 'google.com', 'web.de', 'email', 'yandex.ru', 'ymail', 'mail.eu', 'mail.bg', 'comcast.net', 'yahoo', 'Yahoo', 'gmail', 'Gmail', 'GMAIL', 'hotmail', 'comcast', 'bellsouth.net', 'verizon.net', 'att.net', 'roadrunner.com', 'charter.net', 'mail.ru', '@live', 'icloud', '@aol', 'facebook', 'Outlook', 'myspace', 'rocketmail']

print "\n[*] This script will remove records that contain the following strings: \n\n", emailDomains

raw_input("\n[!] Press any key to start...\n")

linecounter = 0

with open(oldfile) as oFile, open(newfile, 'w') as nFile:
    for line in oFile:
        if not any(domain in line for domain in emailDomains):
            nFile.write(line)
            linecounter = linecounter + 1
            print '[*] - {%s} Writing verified record to %s ---{ %s' % (linecounter, newfile, line)

print '[*] === COMPLETE === [*]'
print '[*] %s was saved' % newfile
print '[*] There are %s records in your saved file.' % linecounter

Lien vers Gist: emailStripper.py

Best, Az

2
Cyb3rdude

Utilisez le paquet python-textops:

from textops import *

'oldfile.txt' | cat() | grepv('bad') | tofile('newfile.txt')
1
Eric
to_skip = ("bad", "naughty")
out_handle = open("testout", "w")

with open("testin", "r") as handle:
    for line in handle:
        if set(line.split(" ")).intersection(to_skip):
            continue
        out_handle.write(line)
out_handle.close()
0
carpx