如何高效遍历目录中同<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}")
# 这里可以加入你的业务逻辑,比如读取文件内容等
方案优势
- 完全迭代式处理:依赖
glob.iglob的惰性遍历特性,不会一次性把所有文件路径加载到内存,哪怕有几十万甚至上百万个文件也能轻松应对。 - 不依赖遍历顺序:不管
glob返回文件的顺序是怎样的,只要某个前缀的两个文件都被遍历到,就会立即输出配对,完全不用关心顺序问题。 - 内存友好:字典里只会暂存当前未配对的文件路径,凑齐一对就移除对应的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
相关产品推荐
相关产品推荐

