Попытка понять python csv.next()
У меня есть следующий код, который является частью учебника
import csv as csv
import numpy as np
csv_file_object = csv.reader(open("train.csv", 'rb'))
header = csv_file_object.next()
data = []
for row in csv_file_object:
data.append(row)
data = np.array(data)
код работает так, как предполагается, но мне непонятно, почему работает вызов .next()
в файле с переменной header
. Не все ли файл csv_file_object? Как известно программе, чтобы пропустить строку заголовка при вызове for row in csv_file_object
, поскольку она не отображается, когда заголовок переменной всегда ссылается после определения?
Ответы
Ответ 1
Строка заголовка "пропущена" в результате вызова next()
. То, как работают итераторы.
Когда вы перебираете итератор, его метод next()
вызывается каждый раз. Каждый вызов продвигает итератор. Когда цикл for
запускается, итератор уже находится во второй строке, и он идет оттуда.
Здесь документация по методу next()
(здесь другая часть).
Важно то, что объекты csv.reader
являются итераторами, как и объект файл, возвращаемый open()
. Вы можете перебирать их, но они не содержат всех строк (или любой из строк) в любой момент.
Ответ 2
Объект csv.reader
является итератором. Итератор - это объект с методом next()
, который вернет следующее доступное значение или поднимет StopIteration
, если значение не доступно. csv.reader
будет возвращать значение по строкам.
Объекты итераторов - это то, как python реализует цикл for
. В начале цикла будет вызываться объект __iter__
объекта с зацикленными объектами. Он должен вернуть итератор. Затем будет вызываться метод next
этого объекта и значение, сохраненное в переменной цикла до тех пор, пока метод next
не вызовет исключение StopIteration
.
В вашем примере, добавив вызов к следующему, прежде чем использовать переменную в контуре цикла for
, вы удаляете первое значение из потока значений, возвращаемых итератором.
Вы можете видеть тот же эффект с более простыми итераторами:
iterator = [0, 1, 2, 3, 4, 5].__iter__()
value = iterator.next()
for v in iterator:
print v,
1 2 3 4 5
print value
0
Ответ 3
csv.reader - итератор. Он читает строку из csv каждый раз, когда вызывается .next. Здесь документация: http://docs.python.org/2/library/csv.html. Объект итератора может фактически возвращать значения из источника, который слишком велик, чтобы читать все сразу. использование цикла for с итератором эффективно вызывает .next каждый раз через цикл.
Ответ 4
csv.reader - это итератор. Вызов .next() будет получать следующее значение, поскольку оно итерации через файл.
В приведенном ниже коде цикл for вызывает вызов .next() на итераторе каждый раз и выделяет результат рядом со строкой переменной.
for row in csv_file_object:
data.append(row)
Ответ 5
Поведение next() больше, чем все, все выставляемые выше - это нормально, но есть одна вещь, отсутствующая, а также использование следующего: вы указываете итератору, из какой строки вы хотите начать итерацию, поэтому проблема в том, Я хочу, чтобы какое-то значение находилось в строке 3 без прохождения всех строк, которые я могу легко использовать следующим образом. Я получил значение, но если мне нужно итерации на первой строке в моем случае, я не могу, потому что независимо от того, что итератор все еще запускает в строке 3, поэтому я не могу начать с строки 1, но есть способ, но я еще не нашел его.