2011-01-24 7 views

Respuesta

45
searchfile = open("file.txt", "r") 
for line in searchfile: 
    if "searchphrase" in line: print line 
searchfile.close() 

Para imprimir múltiples líneas (de una manera sencilla)

f = open("file.txt", "r") 
searchlines = f.readlines() 
f.close() 
for i, line in enumerate(searchlines): 
    if "searchphrase" in line: 
     for l in searchlines[i:i+3]: print l, 
     print 

La coma en print l, evita espacios adicionales que no aparezcan en la salida; la instrucción de impresión final demarca los resultados de diferentes líneas.

O aún mejor (el robo de vuelta de Mark Ransom):

with open("file.txt", "r") as f: 
    searchlines = f.readlines() 
for i, line in enumerate(searchlines): 
    if "searchphrase" in line: 
     for l in searchlines[i:i+3]: print l, 
     print 
+1

cerrar el archivo después del procesamiento. – Rozuur

+2

¿Cómo imprimiría esa línea y otras tres líneas debajo? –

+0

@Rozuur: suficiente. editado – senderle

19
with open('file.txt', 'r') as searchfile: 
    for line in searchfile: 
     if 'searchphrase' in line: 
      print line 

Con perdón de senderle quien descaradamente copiados.

+2

+1. Estaba molesto, pero luego me tomé un momento para entender la declaración con. ¡Esto es genial! – senderle

+3

@senderle, gracias por eso. Consideré simplemente editar tu respuesta, pero pensé que sería aún más molesto, y la declaración 'with' es una adición bastante reciente a Python, haciendo que tu respuesta sea la más apropiada para algunas personas. ¡Obtuviste mi +1 hace mucho tiempo! –

+1

sí, una reciente y para mí, críptica, además, hasta ahora; Debo admitir que hace unas semanas me costaba asimilar el enunciado con el enunciado y había quedado en blanco, pero este simple ejemplo lo explica perfectamente. – senderle

2

Tenga en cuenta la posibilidad de un índice fuera de rango con "i + 3". Podría hacer algo como:

with open("file.txt", "r") as f: 
    searchlines = f.readlines() 
j=len(searchlines)-1 
for i, line in enumerate(searchlines): 
    if "searchphrase" in line: 
     k=min(i+3,j) 
     for l in searchlines[i:k]: print l, 
     print 

Editar: tal vez no sea necesario. Acabo de probar algunos ejemplos. x [y] dará errores si y está fuera del rango, pero x [y: z] no parece dar errores para los valores fuera de rango de y y z.

+0

Cortar no produce errores fuera de rango. Cuando tomas una porción, dices "dame una lista de los elementos en este rango". Si no hay elementos en el rango dado, entonces una lista vacía entrega lo que se solicitó. Por otro lado, la indexación dice "dame el ítem exacto en el índice 'i'". Si no hay ningún elemento en 'i', entonces devolver algo, incluso' None', sería una mentira, por lo que es mejor hacer una excepción. – senderle

Cuestiones relacionadas