我有以下代码是教程的一部分
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
被调用时,程序如何知道跳过标题行,因为一旦定义变量标题就不会被引用?
答案 0 :(得分:14)
由于调用next()
,标题行被“跳过”。这就是迭代器的工作方式。
循环遍历迭代器时,每次调用其next()
方法。每次调用都会使迭代器前进。当for
循环开始时,迭代器已经在第二行,并且它从那里开始。
next()
方法(the documentation)上的here's another piece。
重要的是csv.reader
个对象是迭代器,就像open()
返回的文件对象一样。您可以迭代它们,但它们在任何给定时刻都不包含所有行(或任何行)。
答案 1 :(得分: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
答案 2 :(得分:1)
csv.reader是一个迭代器。每次调用.next时,它都会从csv中读取一行。这是文档:http://docs.python.org/2/library/csv.html。迭代器对象实际上可以从一个太大而无法一次读取的源返回值。使用带有迭代器的for循环,每次循环都会有效地调用.next。
答案 3 :(得分:1)
csv.reader是一个迭代器。调用.next()将在迭代文件时获取下一个值。
在下面的代码中,for循环每次都在迭代器上调用.next()并将结果分配给变量行。
for row in csv_file_object:
data.append(row)
答案 4 :(得分:0)
next()的行为不止于此,上面所有暴露都没问题,但是有一件事丢失了,也就是使用next你要告诉迭代器你要从哪条线开始迭代所以这是一个问题让我们说我想要一些在第3行中的值,而不是通过我可以轻松使用的所有行,我得到了值,但是如果我需要在我的情况下迭代第一行我不能,因为无论迭代器还是什么都开始在第3行所以我不能从第1行开始有一种方法,但我还没有找到它。