如何用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
相关产品推荐
相关产品推荐

