Python中处理next()调用抛出的StopIteration异常
Python中处理next()调用抛出的StopIteration异常
嘿,这个场景我太熟悉了!用itertuples遍历大DataFrame的时候,手动调用next()批量跳过元素,确实会在迭代器耗尽时触发StopIteration异常,这里有两个惯用的处理方案,你可以根据需求选择:
方案一:直接捕获StopIteration异常
最直接的方式就是把批量调用next()的逻辑包裹在try-except块里,当异常触发时,说明迭代器已经走到末尾了,我们直接跳出循环就行:
it = df.itertuples() for row in it: if 你的条件满足: try: # 尝试跳过19条记录 [next(it) for _ in range(19)] except StopIteration: # 迭代器已经没有更多元素了,直接退出外层循环 break # 这里写你处理当前行的业务逻辑 ...
这种方式逻辑清晰,能精准处理迭代器耗尽的情况,不会让程序崩溃。不过要注意,用列表推导式会生成一个包含19个行对象的无用列表,对于超大DataFrame来说虽然影响不大,但多少有点浪费内存。
方案二:用itertools.islice安全跳过元素(更Pythonic)
这其实是更推荐的写法,itertools.islice专门用来从迭代器中截取指定数量的元素,就算迭代器剩余元素不足指定数量,它也只会取完剩下的所有元素,不会抛出任何异常。而且它不会生成无用的列表,效率更高:
from itertools import islice it = df.itertuples() for row in it: if 你的条件满足: # 用islice跳过最多19条记录,不够的话就取完剩下的 # 直接遍历islice返回的迭代器来耗尽它 for _ in islice(it, 19): pass # 这里写你处理当前行的业务逻辑 ...
或者你也可以用一行代码搞定(不过上面的写法可读性更好):
next(islice(it, 19, 19), None)
原理是islice(it, 19)生成一个最多包含19个元素的迭代器,我们遍历它就相当于跳过了这些元素,当迭代器里没元素了,islice也会安静地停止,外层的for循环随后也会自然结束,完全不需要处理异常,非常省心。
备注:内容来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

