2011-03-09 32 views
8

En Python, quiero escribir un programa que filtre las líneas de mi archivo de texto que contenga la palabra "manzana" y las escriba en un nuevo archivo de texto. Lo que he intentado solo escribe la palabra "manzana" en mi nuevo archivo de texto, mientras que quiero líneas enteras. Soy un principiante en Python, así que amablemente responda a mi pregunta, ya que realmente lo necesito.Python: filtrar líneas de un archivo de texto que contiene una palabra particular

Respuesta

16

uso puede conseguir todas las líneas que contenga 'manzana' usando una lista-comprensión:

[ line for line in open('textfile') if 'apple' in line] 

Por lo tanto - también en una sola línea de código - puede crear el nuevo archivo de texto:

open('newfile','w').writelines([ line for line in open('textfile') if 'apple' in line]) 

Y EYQUEM tiene razón: es definitivamente más rápido para mantenerlo como un iterador y escribir

open('newfile','w').writelines(line for line in open('textfile') if 'apple' in line) 
+3

Una lista por comprensión crea un objeto. Usar una expresión de generador sería mejor. Por cierto, se puede escribir '' writelines (línea para línea en abierto ('archivo de texto') si 'apple' en línea) '' – eyquem

+0

@eyquem: Ok, estoy totalmente de acuerdo en que, para archivos grandes, debería ser es mejor utilizar generadores, ya que un generador se comporta de forma perezosa y, por lo tanto, no consume tanta memoria. Pero probablemente para archivos pequeños, la comprensión de la lista es la solución más rápida. – phynfo

+0

@Phynfo: No ... guardar cosas como generadores/iteradores es mucho más eficiente. La lista de comprensión todavía está creando el iterador, que luego está llenando una lista, y una vez completa, pasa esa lista a writelines que la convierte de nuevo en un iterador. –

1

if "apple" in line: Deberia trabajar.

8
from itertools import ifilter 

with open('source.txt','rb') as f,open('new.txt','wb') as g: 

    g.writelines(ifilter(lambda line: 'apple' in line, f)) 
5

El uso de generadores, esta es la memoria eficiente y rápido

def apple_finder(file): 
    for line in file: 
     if 'apple' in line: 
      yield line 


source = open('forest','rb') 

apples = apple_finder(source) 

Me encanta soluciones fáciles sin daño cerebral para la lectura :-)

+1

La función ** apple_finder (archivo) ** es un generador de funciones y ** apples ** es un generador. Los últimos hacen el mismo trabajo que ** ifilter (línea lambda: 'apple' en línea, f) ** en dos líneas (importación comprendida) – eyquem

Cuestiones relacionadas