2011-01-24 10 views

risposta

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

Per stampare più linee (in modo semplice)

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 virgola in print l, impedisce spazi aggiuntivi di apparire in uscita; la dichiarazione di stampa finale delimita i risultati da linee diverse.

O meglio ancora (rubare indietro da 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

chiude il file dopo l'elaborazione. – Rozuur

+2

Come potrei stampare quella linea e altre tre linee sotto di essa? –

+0

@Rozuur: abbastanza giusto. modificato. – senderle

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

Con scuse a senderle che ho palesemente copiato.

+2

+1. Ero infastidito - ma poi ho preso un momento per capire la frase con. È fantastico! – senderle

+3

@senderle, grazie per quello. Ho preso in considerazione la possibilità di modificare la tua risposta, ma ho pensato che sarebbe stato ancora più noioso - e l'istruzione 'with' è un'aggiunta piuttosto recente a Python, rendendo la tua risposta la più appropriata per alcune persone. Hai ottenuto il mio +1 molto tempo fa! –

+1

sì, una recente e per me, criptica, aggiunta, fino ad ora; Devo ammettere che avevo faticato a strappare la frase con alcune settimane fa ed era venuto fuori vuoto - ma questo semplice esempio lo spiega perfettamente. – senderle

2

Nota il potenziale per un indice di fuori intervallo con "i + 3". Potresti fare qualcosa del tipo:

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 

Modifica: forse non necessario. Ho appena provato alcuni esempi. x [y] darà errori se y è fuori range, ma x [y: z] non sembra dare errori per i valori fuori range di y e z.

+0

La slicing non produce errori fuori intervallo. Quando prendi una fetta, dici "dammi un elenco degli articoli in questo intervallo". Se non ci sono elementi nell'intervallo specificato, una lista vuota fornisce ciò che è stato chiesto. D'altra parte, l'indicizzazione dice "dammi l'oggetto esatto all'indice" i "." Se non ci sono elementi in 'i', restituire qualcosa - anche' None' - sarebbe una bugia, quindi è meglio sollevare un'eccezione. – senderle

Problemi correlati