gpt4 book ai didi

python - 如何在 for 循环迭代器中捕获异常

转载 作者:IT老高 更新时间:2023-10-28 22:08:29 24 4
gpt4 key购买 nike

这是 Python 中的 for 循环:

for_stmt ::=  "for" target_list "in" expression_list ":" suite

通常,当从 expression_list 产生一个值引发异常时,循环中止。有没有一种优雅的方法(不使用 while True 或类似的东西重写循环)来捕获这个异常并继续循环?

这是一个例子:

import csv

csv.field_size_limit(10)

reader = csv.reader(open('test.csv', 'r'))
for line in reader:
print(line)

使用此文件:

foo,bar,baz
xxx,veryverylong,yyy
abc,def,ghi

这将在第二行中止。我想要一种方法来跳过或记录失败的行并继续。

最佳答案

如果你的内部迭代可以在异常之后继续,你只需要包装一个简单的生成器:

def wrapper(gen):
while True:
try:
yield next(gen)
except StopIteration:
break
except Exception as e:
print(e) # or whatever kind of logging you want

例如:

In [9]: list(wrapper(csv.reader(open('test.csv', 'r'))))
field larger than field limit (10)
Out[9]: [['foo', 'bar', 'baz'], ['abc', 'def', 'ghi']]

另一方面,如果内部迭代器在异常后无法继续,则无法包装它:

def raisinggenfunc():
yield 1
raise ValueError("spurious error")
yield 3

In [11]: list(wrapper(raisinggenfunc()))
spurious error
Out[11]: [1]

通过调用 Python 生成器函数或评估生成器表达式创建的任何生成器都将不可恢复。

在这种情况下,您需要找到某种方法来创建一个新的迭代器来恢复迭代。对于像 csv.reader 这样的东西,这意味着在将文件包装到 csv.reader 之前从文件中读取 n 行。在其他情况下,它可能意味着将 n 传递给构造函数。在其他情况下——就像上面的 raisinggenfunc 一样,这是不可能的。

关于python - 如何在 for 循环迭代器中捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13653783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com