Python迭代器分组排序列数据:最后一组未返回的问题求解
问题分析与代码修复
你的代码核心问题出在文件读取至末尾时的逻辑顺序:当line为空(文件读完),你先执行了raise StopIteration,这会直接终止迭代,后续的return self.trunk完全没机会执行,导致最后一组数据无法返回。
另外原代码还有两处可以优化的细节:
- 初始化
self.last为[]会让首次判断逻辑绕弯,改成None更清晰 - 每次
__next__里用self.trunk = [self.last]初始化分组,容易引入空列表的冗余判断
下面是修复后的代码:
class sequence(object): def __init__(self, filePath): self.file = open(filePath, 'r') self.current_group = [] self.next_line = None def __iter__(self): # 预读第一行,初始化后续迭代的起始数据 line = self.file.readline() if line: self.next_line = line.strip('\n').split('\t') return self def __next__(self): # 无后续数据且当前分组为空时,终止迭代并关闭文件 if self.next_line is None and not self.current_group: self.file.close() raise StopIteration # 初始化当前分组为第一个元素 self.current_group = [self.next_line] # 循环读取后续行,直到分组结束或文件末尾 while True: line = self.file.readline() if not line: # 文件读完,返回当前分组,下次迭代触发终止 self.next_line = None return self.current_group line_data = line.strip('\n').split('\t') if line_data[1] == self.current_group[0][1]: self.current_group.append(line_data) else: # 遇到不同分组,保存当前行,返回已收集的分组 self.next_line = line_data return self.current_group # 测试执行 a = sequence('tst.txt') for i in a: print(i)
关键修复说明:
- 在
__iter__方法里预读第一行,避免__next__中重复处理初始化逻辑 - 文件读取到末尾时,先返回当前已收集的完整分组,再在下次迭代时触发终止
- 添加文件关闭逻辑,避免资源泄漏
- 简化分组判断逻辑,让代码更直观易懂
运行修复后的代码,就能得到包含最后一组D的完整四组结果。
内容的提问来源于stack exchange,提问作者Zewei Song
相关产品推荐
相关产品推荐

