python - 为什么在使用 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    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(keys)print(list(c)) 之后给出 StopIteration 我读了文档,但我不清楚这个特定示例。

最佳答案

错误与 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 是一个迭代器对象(非常类似于上面的 generator a),并且要迭代一次直到用完。对该对象调用 list 将耗尽它,以便可以将元素收集到一个列表中。

一旦对象被耗尽,它就不会再产生任何元素。此时,生成器机制旨在引发 StopIteration,如果您尝试对其进行迭代,即使它已经耗尽。 for 循环等结构监听此错误,默默地吞下它,但是,next 会在引发异常后立即返回原始异常。

关于python - 为什么在使用 next() 时出现 StopIteration 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48180209/

相关文章:

python - PNG 支持 python 3.3

python - 将标准输出重定向到 tkinter 文本小部件

python - 我无法让 ipython 控制台在spyder 中播放声音

在 C 中捕获段错误

c# - c# dll 将错误返回给调用应用程序的好方法是什么?

python - 登录后django重定向不起作用 "next"没有发布?

Python - 如何在 Try Catch 之后继续循环?

javascript - 如何在没有 PHP(仅 jQuery/javascript)的情况下按顺序链接到下一页和上一页

python - 如何从所有满二叉树中采样?

jquery - jQuery 1.9 中 fadeIn 的未捕获类型错误