2012-09-28 17 views
15

Sto leggendo un file e mi chiedo se c'è un modo per leggere la riga successiva in un ciclo for?Ottenere la riga successiva in un file

Attualmente sto leggendo il file in questo modo:

file = open(input,"r").read() 
for line in file.splitlines(): 
    line = doSomething() 

Così, c'è qualche cosa che posso recuperare la riga successiva del file in quel ciclo for in modo tale che posso eseguire alcune operazioni nella funzione doSomething()?

Grazie

risposta

30

Basta un loop all'interno di file aperto:

infile = open(input,"r") 
for line in infile: 
    line = doSomething(line, next(infile)) 

Perché è ora possibile utilizzare il file come un iteratore, è possibile chiamare il next() function sulla variabile infile in qualsiasi momento per recuperare una riga in più .

Due consigli aggiuntivi:

  1. Non chiamare la variabile file; maschera l'oggetto di tipo file integrato in python. L'ho chiamato invece infile.

  2. È possibile utilizzare il file aperto come gestore del contesto con l'istruzione with. Sarà chiudere il file in modo automatico quando fatto:

    with open(input,"r") as infile: 
        for line in infile: 
         line = doSomething(line, next(infile)) 
    
+0

questo è migliore della mia soluzione di indicizzazione in quanto effettivamente incrementa anche il contatore ... –

+0

@Martijin: una piccola query: l'uso di 'next()' sposterà il puntatore alla riga successiva, ma quando il controllo ritorna al ciclo for, leggerà nuovamente la riga "next" o passerà alla riga next-to-next? – Konstant

+0

@ Konstant: accanto al prossimo. Anche l'uso di un ciclo 'for' chiama' .next() 'e ogni volta che lo fai, viene restituita una * nuova * riga fino al termine del file. –

6
file = open(input,"r").read() 
lines = file.read().splitlines() 
for i in range(len(lines)): 
    line = lines[i] 
    next_line = lines[i+1] 
+3

perché -1? ... questo fa quello che è stato chiesto ... La risposta di Martjin è meglio garantita ma questo ti dà la linea successiva (almeno ora lo fa .. mancava la lettura()) ... –

8

Penso che vuoi dire che se si è in linea n, si vuole essere in grado di accedere a linea n + 1.

Il modo più semplice per farlo è quello di sostituire il

for line in file.splitlines():

con

lines = file.readlines() 
for i in xrange(len(lines)): 

quindi è possibile ottenere la linea corrente con lines[i] e la prossima linea con lines[i+1]

la il modo più pitone è usare l'elenco

lines = file.readlines() 
for index, line in enumerate(lines): 

ora avete la linea corrente in "linea" come normale, ma avete anche l'indice se volete trovare una linea diversa rispetto ad essa.

+0

Martin ha postato la sua risposta mentre stavo combattendo con il editore. La sua è un po 'più snella, ma vale ancora la pena di essere a conoscenza dell'opzione enumerate. – BostonJohn

+0

Trovando questa risposta nel 2016, si sottolinea che 'xrange' non esiste in Python 3 e 'invece dovrebbe essere usato' range '. – Michael

Problemi correlati