18

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

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调用时跳过标题行,因为一旦定义变量标题就不会出现?

4

5 回答 5

20

由于调用,标题行被“跳过” next()。这就是迭代器的工作方式。

当你遍历一个迭代器时,它的next()方法每次都会被调用。每次调用都会推进迭代器。当for循环开始时,迭代器已经在第二行,并且从那里开始。

这是该方法的文档next()这是另一篇)。

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

于 2013-01-27T19:53:19.453 回答
6

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

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

在您的示例中,通过在循环构造中使用变量之前添加对 next 的调用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
于 2013-01-27T20:00:48.363 回答
1

csv.reader 是一个迭代器。每次调用 .next 时,它都会从 csv 中读取一行。这是文档:http ://docs.python.org/2/library/csv.html 。迭代器对象实际上可以从一个太大而无法一次读取的源返回值。使用带有迭代器的 for 循环每次通过循环时都会有效地调用 .next 。

于 2013-01-27T19:55:17.227 回答
1

csv.reader 是一个迭代器。调用 .next() 将在遍历文件时获得下一个值。

在下面的代码中,for 循环每次都在迭代器上调用 .next() 并将 next 的结果分配到变量行。

for row in csv_file_object:
    data.append(row)
于 2013-01-27T20:04:22.677 回答
0

next() 的行为不止于此,上面的所有暴露都可以,但是缺少一件事,还使用 ​​next 你告诉迭代器你想从哪一行开始迭代所以是一个问题让我们说我想要一些第 3 行中的值没有经过我可以轻松使用的所有行接下来我得到了该值,但是如果我需要在第一行迭代我不能因为无论迭代器仍然从第 3 行开始所以我不能从第 1 行开始,有一种方法,但我还没有找到。

于 2016-03-17T02:33:08.070 回答