Python自定义读取多文本文件类迭代时重复输出整列表问题排查
问题根因
你实现的迭代器__next__方法逻辑错误:当前每次迭代都会返回完整的self.filters_list列表,而不是列表中对应下标的单条内容,所以遍历多少次就会打印多少次完整列表,和预期输出不符。
另外原有代码还有两处可优化/修正的细节:
- 收集文件名时不需要额外打开文件,无意义IO操作还可能增加报错概率
- 原有下标判断逻辑会漏掉列表第一个元素:初始
self.current=0,先自增1再判断,会直接跳过索引为0的第一条数据
修正后的ReadFilesToList.py完整代码
import os import re class ReadFilesToList: # 类初始化 def __init__(self): self.current = 0 self.high = 0 self.filenames_list = [] # 存储待读取的所有txt文件名 self.filters_list = [] # 存储所有处理后的文本内容 # 收集filters目录下的所有txt文件名 for filename in os.listdir("filters"): # 只处理txt文件,避免目录下其他格式文件报错 if filename.endswith('.txt'): self.filenames_list.append(filename) # 逐个读取文件内容处理 for filename in self.filenames_list: with open(os.path.join("filters", filename), 'r', encoding='utf-8') as f: data_list = f.read().splitlines() # 去掉表头第一行 del data_list[0] # 逐行处理分隔符 for line in data_list: # 统一把多个空格/制表符替换为| processed_line = re.sub(r"[\t ]+", "|", line.strip()) self.filters_list.append(processed_line) # 记录总条数 self.high = len(self.filters_list) # 迭代器返回自身 def __iter__(self): # 每次迭代前重置下标,避免多次遍历只能跑一次的问题 self.current = 0 return self # 迭代器取值逻辑 def __next__(self): if self.current >= self.high: raise StopIteration current_val = self.filters_list[self.current] self.current += 1 return current_val # 直接调用类实例返回完整列表 def __call__(self): return self.filters_list
效果验证
运行main.py中的遍历代码后,就会按预期逐行输出单条内容,不会重复打印完整列表。
内容的提问来源于stack exchange,提问作者Europa
相关产品推荐
相关产品推荐

