solo per chiarire, il codice già "legge" tutte le linee. Per iniziare a "prestare attenzione" alle linee dopo un certo punto, puoi semplicemente impostare un flag booleano per indicare se le linee dovrebbero o meno essere ignorate e controllarle su ogni riga.
pay_attention = False
for line in f:
if pay_attention:
print line
else: # We haven't found our trigger yet; see if it's in this line
if 'Abstract' in line:
pay_attention = True
Se non ti dispiace un po 'più risistemare del codice, è possibile utilizzare anche due loop parziali invece: un ciclo che termina una volta che hai trovato la tua frase di innesco ('Abstract'
), e uno che legge tutte le righe seguenti. Questo approccio è un po 'più pulito (e un po' più veloce).
for skippable_line in f: # First skim over all lines until we find 'Abstract'.
if 'Abstract' in skippable_line:
break
for line in f: # The file's iterator starts up again right where we left it.
print line
Il motivo per cui funziona è che l'oggetto file restituito da open
si comporta come un generator, piuttosto che, diciamo, un elenco: produce solo i valori in cui sono richiesti. Quindi, quando si arresta il primo ciclo, il file viene lasciato con la sua posizione interna impostata all'inizio della prima riga "non letta". Ciò significa che quando inserisci il secondo ciclo, la prima riga che vedi è la prima riga dopo quella che ha attivato lo break
.
fonte
2015-01-06 19:41:54
Funziona, ma è un po 'strano, non credi? e chiunque non capisca come funzionano i generatori si gratterà la testa da * perché * produce un output corretto. – Kroltan
@Kroltan, beh presumo che le persone che guardano a python sappiano come funziona il codice Python. Questo è python piuttosto semplice –
Beh, ma non sarei così sicuro che l'OP ne fosse a conoscenza. – Kroltan