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

如何高效遍历目录中同<int>前缀的成对TXT文件?

高效遍历配对-.txt文件对的方法

这个场景太典型了——面对大量成对的文件,既要精准配对又不想把所有文件路径一次性加载到内存里(毕竟文件多了列表会爆炸),之前用glob.iglob加zip的思路因为遍历顺序不确定而翻车,排序又会生成超大列表,确实得换个迭代式的高效方案。

我推荐用生成器+字典逐步收集配对的方法,核心思路是边遍历文件边暂存未配对的路径,凑齐一对就输出一对,全程不用加载所有文件到内存,内存占用极低。

具体实现代码

import glob
import os
from collections import defaultdict

def yield_file_pairs(pattern="*-*.txt"):
    # 用字典暂存每个前缀对应的未配对文件
    unpaired_files = defaultdict(list)
    
    # 迭代遍历所有符合模式的文件(不一次性加载全列表)
    for file_path in glob.iglob(pattern):
        # 提取文件名(去掉路径部分)
        filename = os.path.basename(file_path)
        # 拆分前缀(<int>部分)和剩余部分
        prefix, rest = filename.split('-', 1)
        # 提取code部分(去掉.txt后缀)
        code, _ = os.path.splitext(rest)
        
        # 将当前文件路径加入对应前缀的列表
        unpaired_files[prefix].append(file_path)
        
        # 当该前缀下凑齐两个文件时,返回配对并从字典移除(释放内存)
        if len(unpaired_files[prefix]) == 2:
            yield tuple(unpaired_files.pop(prefix))

# 使用示例:迭代处理每一对文件
for a_file, b_file in yield_file_pairs():
    print(f"配对成功:{a_file} <-> {b_file}")
    # 这里可以加入你的业务逻辑,比如读取文件内容等

方案优势

  1. 完全迭代式处理:依赖glob.iglob的惰性遍历特性,不会一次性把所有文件路径加载到内存,哪怕有几十万甚至上百万个文件也能轻松应对。
  2. 不依赖遍历顺序:不管glob返回文件的顺序是怎样的,只要某个前缀的两个文件都被遍历到,就会立即输出配对,完全不用关心顺序问题。
  3. 内存友好:字典里只会暂存当前未配对的文件路径,凑齐一对就移除对应的key,内存占用始终保持在最低水平。

额外处理(可选)

如果存在不成对的文件(比如某个前缀只有-A.txt没有-B.txt),遍历结束后unpaired_files字典里会剩下这些孤立文件,你可以在函数末尾加入逻辑处理:

# 在yield_file_pairs函数最后添加
if unpaired_files:
    print("发现未配对的文件:")
    for prefix, files in unpaired_files.items():
        print(f"前缀 {prefix}: {files}")

这个方案完美解决了你提到的所有痛点:既高效遍历配对,又避免了全列表求值,完全适配大量文件的场景。

内容的提问来源于stack exchange,提问作者Aechlys

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:45:48