如何使用Python按目录分组输出检索到的指定文件
问题背景
现有Python代码用于遍历指定目录,检索特定名称的文件并输出路径,原始代码如下:
import os for root, dirs, files in os.walk("D:/Llanos/INFORMES TF 31-05-2022", topdown=False): dictionary = ["INFORME.pdf", "CARTA.pdf", "FUN ONI.pdf"] for i in range(0, 3): for file in files: if file.endswith(dictionary[i]): directorio, carpeta, archivo = os.path.join(root, file).split("\\") print(directorio+"/"+carpeta,";", archivo)
原始输出逻辑为每个匹配文件单独占一行,格式为目录路径 ; 文件名,同一目录下的多个匹配文件会拆分为多条独立记录。需要调整为按目录路径分组,将同一目录下匹配到的所有文件名拼接在对应目录路径的同一行输出,同目录下缺少的目标文件无需补全。
实现方案
通过字典暂存每个目录下匹配到的文件列表完成分组,遍历完所有目录后统一输出即可,优化后的代码同时修复了原代码硬编码路径分隔符、匹配逻辑可能误判的问题:
import os from collections import defaultdict # 基础配置 scan_root = "D:/Llanos/INFORMES TF 31-05-2022" target_filenames = {"INFORME.pdf", "CARTA.pdf", "FUN ONI.pdf"} grouped_result = defaultdict(list) for root, _, files in os.walk(scan_root, topdown=False): for file in files: # 精确匹配目标文件名,避免endswith误命中类似"TEST_INFORME.pdf"的非目标文件 if file in target_filenames: grouped_result[root].append(file) # 按行输出聚合结果 for dir_path, match_files in grouped_result.items(): # 文件名拼接分隔符可按需修改,当前用逗号+空格分隔 print(f"{dir_path} ; {', '.join(match_files)}")
调整说明
- 移除了原代码中硬编码拆分Windows路径反斜杠的逻辑,直接使用
os.walk返回的root作为目录路径,兼容不同操作系统的路径规则 - 将目标文件名存储为集合做精确匹配,替代原
endswith的后缀匹配逻辑,减少误匹配概率 - 分组存储逻辑没有额外性能损耗,遍历一次目录即可完成全部匹配和聚合,比先输出所有行再二次处理的效率更高
- 如果需要调整同目录下文件名的分隔格式,直接修改
join方法的传入参数即可,比如改用分号、换行符分隔都可以快速实现。
内容的提问来源于stack exchange,提问作者Kevin Llanos
相关产品推荐
相关产品推荐

