next() en python no funciona. ¿Cuál es una alternativa a leer la siguiente línea en Python? Aquí hay una muestra:

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()

Ejecutar esto en un archivo no muestra 'ne'.

18
nish 2 jun. 2011 a las 14:05

5 respuestas

La mejor respuesta

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

Como está leyendo en todas las líneas de todos modos, puede consultar la siguiente línea utilizando 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
17
vitaut 21 jun. 2014 a las 00:22

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, utilizando la función pairwise de itertools recetas :

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

Puedes cambiar tu ciclo a:

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
2
tzot 4 jun. 2011 a las 13:16

Cuando lo haga: f.readlines() ya ha leído todo el archivo, por lo que f.tell() le mostrará que está al final del archivo, y al hacer f.next() se obtendrá un StopIteration error.

La alternativa de lo que quieres 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
29
mouad 6 oct. 2013 a las 10:32

No necesita leer la siguiente línea, está iterando a través de las líneas. líneas es una lista (una matriz), y para línea en línea está iterando sobre ella. Cada vez que termine con uno, pasa a la línea siguiente. Si desea pasar a la siguiente línea, simplemente continuar 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()
1
Cormac Mulhall 2 jun. 2011 a las 10:15
lines = f.readlines()

Lee todas las líneas del archivo f. Por lo tanto, tiene sentido que no haya más líneas para leer en el archivo f. Si desea leer el archivo línea por línea, use readline ().

2
patapizza 2 jun. 2011 a las 10:11