Come si cerca un file di testo per una frase chiave o una parola chiave e poi si stampa la riga in cui si trova la frase chiave o la parola chiave?Cerca in un file di testo e stampa linee correlate in Python?
risposta
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
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.
+1. Ero infastidito - ma poi ho preso un momento per capire la frase con. È fantastico! – senderle
@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! –
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
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.
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
chiude il file dopo l'elaborazione. – Rozuur
Come potrei stampare quella linea e altre tre linee sotto di essa? –
@Rozuur: abbastanza giusto. modificato. – senderle