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