Python читать дальше()

next() в python не работает. Что является альтернативой чтению следующей строки в Python? Вот образец:

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

Запуск этого файла не показывает 'ne'.

Ответ 1

next() не работает в вашем случае, потому что вы сначала вызываете readlines(), который в основном устанавливает итератор файла, указывающий на конец файла.

Так как вы читаете во всех строках, вы можете ссылаться на следующую строку, используя индекс:

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

Ответ 2

Когда вы выполните: f.readlines(), вы уже прочитали весь файл, поэтому f.tell() покажет вам, что вы находитесь в конце файла, а выполнение f.next() приведет к ошибке StopIteration.

Альтернативой тому, что вы хотите сделать, является:

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

Ответ 3

lines = f.readlines()

читает все строки файла f. Поэтому имеет смысл, что в файле f нет никакой строки. Если вы хотите прочитать файл по строкам, используйте readline().

Ответ 4

Небольшое изменение в вашем алгоритме:

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

Однако, используя функцию pairwise из itertools рецептов:

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

вы можете изменить свой цикл на:

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

Ответ 5

Вам не нужно читать следующую строку, вы повторяете строки. строки - это список (массив), а для строки в строках выполняется итерация по нему. Каждый раз, когда вы закончите с ним, вы переходите на следующую строку. Если вы хотите перейти к следующей строке, просто продолжить из текущего цикла.

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