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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:32:44