2012-07-06 16 views
5

Ho bisogno di leggere un file, riga per riga e ho bisogno di sbirciare nella 'riga successiva', quindi prima leggo il file in una lista e poi faccio scorrere l'elenco ... in qualche modo questo sembra scortese, la costruzione della lista potrebbe essere costosa.accesso al file sbirciare avanti

for line in open(filename, 'r'): 
    lines.append(line[:-1]) 

for cn in range(0, len(lines)): 
    line = lines[cn] 
    nextline = lines[cn+1] # actual code checks for this eof overflow 

ci deve essere un modo migliore per iterare le righe, ma non so come sbirciare avanti

+2

Perché avete bisogno di sbirciare in anticipo? Non è chiaro dal tuo codice dove avviene la "sbirciatina" e come la usi. – unwind

+2

Ho lasciato quella sbirciatina in anticipo, era troppo grande e non ho fatto luce sul problema del peek ahead – Paul

risposta

6

Si potrebbe essere alla ricerca di qualcosa come la ricetta pairwise da itertools.

from itertools import tee, izip 
def pairwise(iterable): 
    "s -> (s0,s1), (s1,s2), (s2, s3), ..." 
    a, b = tee(iterable) 
    next(b, None) 
    return izip(a, b) 

with open(filename) as f: # Remember to use a with block so the file is safely closed after 
    for line, next_line in pairwise(f): 
     # do stuff 
+1

che è davvero bello, non facile per me in questo momento, ma se mi alzo sulle dita posso semplicemente toccarlo, grazie! – Paul

+0

oke, ottenendo una migliore presa sugli itertools, tuttavia ... non riuscendo a cogliere il significato esatto di next (b, None) ... – Paul

+1

@Paul avanza l'iteratore b avanti di un elemento. Se non ci sono elementi rimasti in un iteratore, allora verrà visualizzato "StopIteration". 'next' accetta un argomento predefinito che restituisce se ciò accade, invece di avere l'errore generato. 'None' è usato solo come segnaposto perché se abbiamo raggiunto la fine dell'iterazione non lo useremo comunque. – jamylak

1

Si potrebbe fare in questo modo

last_line = None 

for line in open(filename):                 
    if last_line is not None: 
     do_stuff(last_line, line) 
    last_line = line               
0

è possibile creare un iterator e farlo in questo modo:

f = open(filename, 'r') 
g = open(filename, 'r') 

y = iter(g.readlines()) 
y.__next__() 

for line in f: 
    print(line) 
    try: 
     print(y.__next__()) 
    except StopIteration: 
     f.close() 
     g.close() 
+0

'g' è già un iteratore sulle righe del file quindi non è necessario per' y'. Suppongo anche che tu stia usando python 3 dato che hai chiamato '__next__', dovresti semplicemente usare' next (y) 'se effettivamente ne hai bisogno. Non penso che sia una buona idea aprire lo stesso file due volte, la mia soluzione usa 'tee' per fare ciò. Dovresti anche chiudere i file o usare un blocco 'with'. – jamylak

+0

'next (y)' non funziona in python 3. E g è un oggetto 'TextIOWrapper'. Quindi, anche se è un oggetto iterabile, non ha il metodo 'next()'. E sì, probabilmente non è una buona idea aprire lo stesso file due volte, ma è solo in modalità di lettura, quindi non pensate che faccia molto male. – Vizard

+0

Sì, usare 'tee' è probabilmente un approccio migliore, ma ho cercato di renderlo il più semplice possibile. – Vizard