如何在Python中按多文件夹模式过滤文件路径列表
解决方案
方法一:字符串匹配(简单直接)
通过all()函数逐个校验路径是否不包含目标文件夹列表中的任何项,这是最直接的实现方式:
file_list1 = ['/home/qrs/sample1.csv', '/home/abc/sample1.csv', '/home/mno/sample13.csv', '/home/xyz/sample2.csv'] change_folder = ['mno', 'xyz'] file_list2 = [x for x in file_list1 if all(folder not in x for folder in change_folder)]
逻辑说明:all(...)会遍历change_folder里的每个文件夹名,只有当所有文件夹名都不在当前路径字符串中时,才将该路径纳入结果列表。
方法二:用pathlib处理路径(更严谨)
如果担心文件名中意外包含目标文件夹名导致误过滤(比如存在/home/qrs/mno_sample.csv这类路径),可以用Python标准库pathlib解析路径结构,精准判断文件夹层级:
from pathlib import Path file_list1 = ['/home/qrs/sample1.csv', '/home/abc/sample1.csv', '/home/mno/sample13.csv', '/home/xyz/sample2.csv'] change_folder = {'mno', 'xyz'} # 用集合提升查找效率 file_list2 = [] for path_str in file_list1: path = Path(path_str) # 提取路径中所有父目录的名称 parent_folders = {parent.name for parent in path.parents} # 若目标文件夹集合与父目录无交集,则保留路径 if not parent_folders & change_folder: file_list2.append(path_str)
逻辑说明:path.parents会返回路径的所有父目录层级,提取名称后和目标文件夹集合做交集判断,完全避免了字符串匹配的误判风险。
原代码失效原因
你写的change_folder not in x是在判断整个列表是否是路径字符串的子串,这不符合需求——列表无法直接和字符串做包含校验,必须逐个检查列表中的每个元素是否存在于路径中。
内容的提问来源于stack exchange,提问作者Arani
相关产品推荐
相关产品推荐

