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

如何用glob仅匹配子目录(排除当前目录)获取含日志的目录?

如何用更Pythonic的方式让glob排除当前目录,仅匹配子目录下的日志文件?

目录结构

<ROOT>/
├── root.log
├── a/
│   ├── xyz/
│   ├── a_xyz.log
├── b/
│   ├── xyz/
│   └── b_xyz.log
├── c/
│   ├── xyz/
│   └── d/
│      ├── xyz/
│      └── b_xyz.log

当前代码

import os
import glob

dirs_where_there_are_logs = {
  os.path.relpath(os.path.dirname(pth), ROOT)
  for pth in glob.iglob(f"{ROOT}/**/*.log", recursive=True)
}

当前输出

{'.', 'a', 'b', 'c', 'c/d'}

期望输出

{'a', 'b', 'c', 'c/d'}

解决方案

方式1:调整glob匹配模式(从源头排除根目录文件)

直接修改glob的路径模式,强制匹配至少一级子目录下的.log文件,这样根目录下的root.log会被直接跳过,自然不会生成.这个相对路径:

dirs_where_there_are_logs = {
  os.path.relpath(os.path.dirname(pth), ROOT)
  for pth in glob.iglob(f"{ROOT}/*/**/*.log", recursive=True)
}

方式2:用赋值表达式简化过滤(Python 3.8+支持)

如果不想调整glob模式,可以利用Python 3.8新增的赋值表达式:=,把相对路径计算和过滤逻辑合并,写法紧凑且Pythonic,避免重复计算:

dirs_where_there_are_logs = {
  rel_dir for pth in glob.iglob(f"{ROOT}/**/*.log", recursive=True)
  if (rel_dir := os.path.relpath(os.path.dirname(pth), ROOT)) != '.'
}

内容的提问来源于stack exchange,提问作者Tony Montana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:17:45