You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:36:08