Eliminar las líneas que contienen cierta cadena

Estoy tratando de leer un texto de un archivo de texto, leer líneas, eliminar líneas que contienen cadenas específicas (en este caso “malo” y “travieso”). El código que escribí va así:

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() 

Escribí así, pero no funciona.

Una cosa importante es, si el contenido del texto era así:

 good baby bad boy good boy normal boy 

No quiero que la salida tenga líneas vacías. así que no como

 good baby good boy normal boy 

Pero así:

 good baby good boy normal boy 

¿Qué debo editar de mi código de lo anterior?

Puedes hacer tu código más simple y más legible así.

 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) 

utilizando un administrador de contexto y cualquiera .

Simplemente podría no incluir la línea en el nuevo archivo en lugar de reemplazar.

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

He usado esto para eliminar palabras no deseadas de archivos de texto:

 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) 

O hacer lo mismo para todos los archivos en un directorio:

 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) 

Estoy seguro de que debe haber una forma más elegante de hacerlo, pero esto hizo lo que yo quería.

El else solo está conectado al último if . Quieres elif

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

También tenga en cuenta que eliminé la sustitución de líneas, ya que de todos modos no escribe esas líneas.

Hoy necesitaba realizar una tarea similar, así que escribí una idea para realizar la tarea en base a algunas investigaciones que hice. Espero que alguien encuentre esto útil!

 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 

Enlace a Gist: emailStripper.py

Mejor, az

Utilice el paquete python-textops:

 from textops import * 'oldfile.txt' | cat() | grepv('bad') | tofile('newfile.txt') 
 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()