试图理解python csv .next()

dav*_*ler 16 python csv python-2.x

我有以下代码是教程的一部分

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)
Run Code Online (Sandbox Code Playgroud)

代码按预期工作,但我不清楚为什么调用.next()带变量的文件header工作.是不是csv_file_object仍然是整个文件?程序如何知道在for row in csv_file_object调用时跳过标题行,因为一旦定义变量标题就不会被引用?

Lev*_*sky 15

作为调用的结果,标题行被"跳过" next().这就是迭代器的工作方式.

循环遍历迭代器时,next()每次调用其方法.每次调用都会使迭代器前进.当for循环开始时,迭代器已经在第二行,它从那里开始.

这是关于方法的文档next()(这是另一篇文章).

重要的是csv.reader对象是迭代器,就像返回的文件对象一样open().您可以迭代它们,但它们在任何给定时刻都不包含所有行(或任何行).


Syl*_*sne 6

csv.reader对象是一个迭代器.迭代器是一个对象,其next()方法将返回下一个可用StopIteration值,如果没有可用值,则返回.该csv.reader会一行返回值线.

迭代器对象是python实现for循环的方式.在循环开始时,__iter__将调用循环对象的对象.它必须返回一个迭代器.然后,next将调用该对象的方法,并将值存储在循环变量中,直到该next方法引发StopIteration异常.

在您的示例中,通过在for循环构造中使用变量之前添加对next的调用,您将从迭代器返回的值流中删除第一个值.

您可以使用更简单的迭代器看到相同的效果:

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
Run Code Online (Sandbox Code Playgroud)