Python 使用next()时停止迭代错误
关于在python(3)中使用Python 使用next()时停止迭代错误,python,error-handling,next,stopiteration,Python,Error Handling,Next,Stopiteration,关于在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
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))
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
回溯(最近一次呼叫最后一次):
2 15882601 4 C | C 9 C | C 6 C | C 5 T | C
文件“/home/everestial007/Test03.py”,第24行,在
键=下一个(c)
文件“/home/everestial007/anaconda3/lib/python3.5/csv.py”,第110行,下一步__
行=下一行(self.reader)
停止迭代
为什么
print(keys)
在print(list(c))
之后要打印(keys)呢?我阅读了文档,但不清楚这个特定示例。错误不在print
语句中。它与keys=next(c)
行一起出现。考虑一个更简单的例子来再现你的问题。
a = (i ** 2 for i in range(5))
a # `a` is a generator object
<generator object <genexpr> at 0x150e286c0>
a=(i**2表示范围(5)内的i)
a#`a`是生成器对象
list(a)#在`a`上调用`list`会耗尽发电机的电能
[0, 1, 4, 9, 16]
next(a)#对耗尽的生成器对象调用'next'将引发'StopIteration'`
---------------------------------------------------------------------------
StopIteration回溯(最后一次调用)
在()
---->1下一(a)
停止迭代:
发生的情况是,c
是一个迭代器对象(非常类似于上面的生成器a
),它将被迭代一次,直到耗尽为止。在此对象上调用list
将耗尽它,以便可以将元素收集到列表中
一旦对象耗尽,它将不再产生任何元素。在这一点上,生成器机制被设计为,如果您尝试在其上进行迭代(即使已耗尽),也会引发StopIteration
。诸如for
循环之类的构造会侦听此错误,并默默地将其吞没,但是,next
在引发原始异常后立即返回该异常。当调用list(c)
时,您将使用迭代器。迭代器现在为空,并且没有下一项。您可能需要通读发电机方面的知识。