2012-08-15 25 views
9

Estoy tratando de leer un texto de un archivo de texto, leer líneas, eliminar líneas que contienen una cadena específica (en este caso 'malo' y 'malo'). El código que he escrito es el siguiente:Eliminar líneas que contienen cierta cadena

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í como este, pero que no funcionó.

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

good baby 
bad boy 
good boy 
normal boy 

no quiero que la salida tiene líneas vacías. por lo que no les gusta:

good baby 

good boy 
normal boy 

pero como esto:

good baby 
good boy 
normal boy 

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

+0

¿Por qué está reemplazando puntos con espacios en líneas que desea ignorar de todos modos? – geoffspear

+0

@Wooble Quizás OP espera que sea una expresión regular, donde 'reemplace 'todas las apariciones de' cualquier cosa' en 'línea' con' nada'. – jadkik94

Respuesta

32

Usted puede hacer su código más simple y más fácil de leer como esto

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 Context Manager y any.

4

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

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

creo que desea "o" en lugar de "y" –

+4

creo "y" es correcto –

+0

quiero que las líneas que solo contengan una mala o naghuty también se eliminen. Cuál es la correcta..? –

1

El else solamente está conectada a la última if. ¿Quieres elif:

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

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

0
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

No funcionará si hay algo así como 'esto es malo!' En el archivo de entrada. – sloth

0

Hoy tenía que llevar a cabo una tarea similar, así que escribí una idea para realizar la tarea en función de algunas investigaciones que hice. ¡Espero que alguien lo encuentre ú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

0

uso python-textops paquete:

from textops import * 

'oldfile.txt' | cat() | grepv('bad') | tofile('newfile.txt') 
0

he utilizado 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 hacía lo que quería.

Cuestiones relacionadas