Python 使用next()时停止迭代错误

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

关于在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))
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)
时,您将使用迭代器。迭代器现在为空,并且没有下一项。您可能需要通读发电机方面的知识。