在python(3)中使用next()
时,我无法澄清自己。
我有一个数据:
chr pos ms01e_PI ms01e_PG_al ms02g_PI ms02g_PG_al ms03g_PI ms03g_PG_al ms04h_PI ms04h_PG_al
2 15881989 4 C|C 6 A|C 7 C|C 7 C|C
2 15882091 4 A|T 6 A|T 7 T|A 7 A|A
2 15882148 4 T|T 6 T|T 7 T|T 7 T|G
我读起来像:
工作正常
c = csv.DictReader(io.StringIO(data), dialect=csv.excel_tab)
print(c)
print(list(c))
工作正常
c = csv.DictReader(io.StringIO(data), dialect=csv.excel_tab)
print(c)
keys = next(c)
print('keys:', keys)
但是,现在有一个问题。
c = csv.DictReader(io.StringIO(data), dialect=csv.excel_tab)
print(c)
print(list(c))
keys = next(c)
print('keys:', keys)
错误消息:
Traceback (most recent call last):
2 15882601 4 C|C 9 C|C 6 C|C 5 T|C
File "/home/everestial007/Test03.py", line 24, in <module>
keys = next(c)
File "/home/everestial007/anaconda3/lib/python3.5/csv.py", line 110, in __next__
row = next(self.reader)
StopIteration
为什么在print(list(c))
之后print(keys)
会给出StopIteration
?我阅读了文档,但不清楚这个特定的示例。
错误不在
print
语句中。是用keys = next(c)
行写的。考虑一个简单的例子来重现你的问题。发生的情况是
c
是一个迭代器对象(非常类似于上面的生成器a
),它应该重复一次,直到耗尽为止。对此对象调用list
将耗尽它,以便可以将元素收集到列表中。一旦对象耗尽,它将不再产生任何元素。在这一点上,生成器机制的设计目的是,如果您试图遍历一个
StopIteration
,即使它已经用尽。诸如for
循环之类的构造会侦听此错误,并静默地将其吞入,但是,next
会在引发原始异常时立即返回该异常。相关问题 更多 >
编程相关推荐