【发布时间】:2012-11-30 21:57:35
【问题描述】:
这是 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
这将在第二行中止。我想要一种方法来跳过或记录失败的行并继续。
【问题讨论】:
-
类似问题:stackoverflow.com/questions/7472786/…,但在这种情况下我无法更改生成器。
-
为什么不只创建一个调用另一个生成器的生成器,而是使用
try/except? -
@StevenRumbalski 这就是我的想法,但是对于
csv.reader,这不是真的(我自己试过了)。它引发了一个_csv.Error,但是在reader上对next()的另一个调用将在引发错误的行之后返回下一个,并且它会像往常一样继续到StopIteration。 -
你能解释一下为什么 try: print(line) except: continue 不起作用吗?
-
@mehtunguh
raise本质上发生在reader.next()中,它在 for 循环本身中被调用。print是事后的事,所以try/catch在它附近是行不通的。