Подтвердить что ты не робот

Попытка понять 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, поскольку она не отображается, когда заголовок переменной всегда ссылается после определения?

4b9b3361

Ответ 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, но есть способ, но я еще не нашел его.