如何在Path.rglob结果中排除路径任意位置含指定模式的项?
如何用Path.rglob排除包含"bad"的路径?
嘿,首先得给你提个醒:rglob("[!bad]my_dir") 这种写法根本达不到你想要的效果哦!因为这里的[!bad]是shell通配符里的单个字符排除规则——它只会匹配那些文件名开头不是b、a、d中任意一个的my_dir,完全不是排除路径里带"bad"字符串的项。
那该怎么实现你的需求呢?给你两种实用的方法:
方法1:先捞全量,再过滤(最推荐)
这是最直观也最靠谱的方式,先用rglob("my_dir")把所有符合的路径都找出来,再把带"bad"的去掉就行。用列表推导式写起来超简洁:
from pathlib import Path # 筛选出路径里不含"bad"的my_dir valid_paths = [p for p in Path(args.path).rglob("my_dir") if "bad" not in str(p)]
要是你喜欢用filter函数,也可以这么写:
valid_paths = list(filter(lambda p: "bad" not in str(p), Path(args.path).rglob("my_dir")))
不管"bad"在路径的哪个位置(比如父目录、祖父目录),这种方法都能精准过滤掉,逻辑也一目了然,维护起来超方便。
方法2:用glob的exclude参数(Python 3.10+专属)
如果你用的是Python 3.10及以上版本,还可以借助glob模块的exclude参数来实现(不过要注意,Path.rglob本身没有这个参数,得换个写法):
from pathlib import Path import glob # 递归查找my_dir,同时排除所有包含bad的路径 valid_paths = [Path(p) for p in glob.glob(f"{args.path}/**/my_dir", recursive=True, exclude="**/bad/**")]
这里的exclude="**/bad/**"就是告诉glob:所有路径里只要有"bad"这个目录的,都给我排除掉,效果和方法1一样,但写法更紧凑。
最后总结一下
- 别纠结用rglob的单个通配符实现复杂排除了,shell通配符没那么强大;
- 优先选方法1,兼容性拉满,逻辑还清晰;
- 要是你用的是新版本Python,方法2也可以试试,省得自己写过滤逻辑。
内容的提问来源于stack exchange,提问作者Lamma
相关产品推荐
相关产品推荐

