python csv模块的reader是一个迭代器,无法多次迭代

在一个项目中,我需要多次遍历一个文本,该文本我是用csv.reader读取的。但后来发现,本文只对第一次循环有用,而之后的循环均为空白。经过排错后,我确定问题就出现在csv.reader()这一步。之后我不调用csv.reader读取文本,直接用readlines(),问题解决。之后查阅CSV模块的说明,发现reader其实是一个迭代器。以前并没有细究可迭代对象与迭代器之间的具体区别,因为以前的使用基本都是遍历文本一次。网上查资料发现:迭代器对象不支持重新迭代,也就是同一个迭代器对象无法多次迭代。

1 In [19]: a = ListIter([1,2,3,4,5])
2  
3 In [20]: [i for i in a]
4 Out[20]: [1, 2, 3, 4, 5]
5  
6 In [21]: [i for i in a]
7 Out[21]: []
8  
9 In [22]:

可见,再次迭代迭代器a的时候便只返回了空列表,这是因为for循环直接捕获了StopIteration异常。如果要再次迭代生成列表的话只能重新生成一个新的迭代器对象。

具体参见:http://python.jobbole.com/85240/

有些问题只有自己项目中经历了,折腾了,才会理解的更深刻。记录笔记,防止下次再掉进这个坑。

原文地址:https://www.cnblogs.com/zhengzh/p/7306938.html