2011-06-02 12 views
11

next() en python no funciona. ¿Qué es una alternativa para leer la siguiente línea en Python? aquí es una muestrapython read next()

filne = "D:/testtube/testdkanimfilternode.txt" 
f = open(filne, 'r+') 

while 1: 
    lines = f.readlines() 
    if not lines: 
     break 
    for line in lines: 
     print line 
     if (line[:5] == "anim "): 
      print 'next() ' 
      ne = f.next() 
      print ' ne ',ne,'\n' 
      break 

f.close() 

La ejecución de este en un archivo no muestra 'ne'

Brgds,

Knish

Respuesta

13

next() no funciona en su caso porque primero llama al readlines() que básicamente establece el iterador del archivo para que apunte al final del archivo.

Puesto que usted está leyendo en todas las líneas de todas formas se puede hacer referencia a la siguiente línea usando un índice:

filne = "in" 
with open(filne, 'r+') as f: 
    lines = f.readlines() 
    for i in range(0, len(lines)): 
     line = lines[i] 
     print line 
     if line[:5] == "anim ": 
      ne = lines[i + 1] # you may want to check that i < len(lines) 
      print ' ne ',ne,'\n' 
      break 
23

Al hacer: f.readlines() que ya ha leído todo el archivo para f.tell() le mostrará que se encuentra al final del archivo y al hacer f.next() se producirá un error StopIteration.

alternativa de lo que quiere hacer es:

filne = "D:/testtube/testdkanimfilternode.txt" 

with open(filne, 'r+') as f: 
    for line in f: 
     if line.startswith("anim "): 
      print f.next() 
      # Or use next(f, '') to return <empty string> instead of raising a 
      # StopIteration if the last line is also a match. 
      break 
2
lines = f.readlines() 

lee todas las líneas del archivo f. Entonces tiene sentido que no haya más líneas para leer en el archivo f. Si quiere leer el archivo línea por línea, use readline().

0

No es necesario leer la siguiente línea, usted está iterando a través de las líneas. líneas es una lista (una matriz) y para la línea en las líneas está iterando sobre ella. Cada vez que terminas con uno pasas a la siguiente línea. Si desea saltar a la siguiente línea solo continúe fuera del ciclo actual.

filne = "D:/testtube/testdkanimfilternode.txt" 
f = open(filne, 'r+') 

lines = f.readlines() # get all lines as a list (array) 

# Iterate over each line, printing each line and then move to the next 
for line in lines: 
    print line 

f.close() 
+0

y como vitaut dice que ya ha leído el archivo completo usando f.readlines. No está iterando sobre el archivo, el archivo completo se ha leído en la memoria. –

1

Un pequeño cambio en su algoritmo:

filne = "D:/testtube/testdkanimfilternode.txt" 
f = open(filne, 'r+') 

while 1: 
    lines = f.readlines() 
    if not lines: 
     break 
    line_iter= iter(lines) # here 
    for line in line_iter: # and here 
     print line 
     if (line[:5] == "anim "): 
      print 'next() ' 
      ne = line_iter.next() # and here 
      print ' ne ',ne,'\n' 
      break 

f.close() 

Sin embargo, el uso de la función pairwise de itertools recipes:

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

puede cambiar su bucle en:

for line, next_line in pairwise(f): # iterate over the file directly 
    print line 
    if line.startswith("anim "): 
     print 'next() ' 
     print ' ne ', next_line, '\n' 
     break