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

2024-05-20 02:31:41 发布

您现在位置:Python中文网/ 问答频道 /正文

在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?我阅读了文档,但不清楚这个特定的示例。


Tags: csviodatapikeysexceltablist
1条回答
网友
1楼 · 发布于 2024-05-20 02:31:41

错误不在print语句中。是用keys = next(c)行写的。考虑一个简单的例子来重现你的问题。

a = (i ** 2 for i in range(5))  

a           # `a` is a generator object
<generator object <genexpr> at 0x150e286c0>

list(a)     # calling `list` on `a` will exhaust the generator
[0, 1, 4, 9, 16]

next(a)     # calling `next` on an exhausted generator object raises `StopIteration`
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-2076-3f6e2eea332d> in <module>()
----> 1 next(a)

StopIteration: 

发生的情况是c是一个迭代器对象(非常类似于上面的生成器a),它应该重复一次,直到耗尽为止。对此对象调用list将耗尽它,以便可以将元素收集到列表中。

一旦对象耗尽,它将不再产生任何元素。在这一点上,生成器机制的设计目的是,如果您试图遍历一个StopIteration,即使它已经用尽。诸如for循环之类的构造会侦听此错误,并静默地将其吞入,但是,next会在引发原始异常时立即返回该异常。

相关问题 更多 >