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

如何提取glob匹配路径中**之后的部分?glob原生支持吗?

问题:提取glob递归匹配中**之后的路径片段

当使用glob('path/to/my/**/*.json', recursive=True)进行递归匹配时,返回的路径示例如下:

path/to/my/subfolder1/subfolder2/file1.json
path/to/my/subfolder1/subfolder2/file2.json
path/to/my/subfolder1/subfolder2/file3.json
path/to/my/subfolder1/file4.json
path/to/my/file5.json
...

我希望仅获取**之后的路径部分,示例如下:

subfolder1/subfolder2/file1.json
subfolder1/subfolder2/file2.json
subfolder1/subfolder2/file3.json
subfolder1/file4.json
file5.json
...

请问最佳实现方式是什么?glob是否原生支持该功能?由于glob输入来自命令行,直接字符串替换难度较大。


解决方案

1. glob原生不支持该功能

Python的glob模块本身没有直接提取**之后路径片段的原生选项,必须通过后续路径处理实现需求。

2. 推荐实现方式

方式一:使用pathlib的relative_to方法(推荐)

利用pathlib的路径对象特性,先拆分出**之前的基础路径,再通过相对路径计算得到目标片段:

from pathlib import Path
import glob

# 假设命令行传入的glob模式为pattern
pattern = "path/to/my/**/*.json"
# 提取**之前的基础路径,去除末尾多余的路径分隔符
base_path = Path(pattern.split("**")[0].rstrip("/"))

# 遍历所有匹配到的路径
for full_path in glob.glob(pattern, recursive=True):
    rel_path = Path(full_path).relative_to(base_path)
    print(rel_path)

该方法自动适配不同操作系统的路径分隔符,兼容性更强。

方式二:使用os.path.relpath

若习惯使用os模块,可通过os.path.relpath计算相对路径:

import os
import glob

pattern = "path/to/my/**/*.json"
# 标准化基础路径,处理不同系统的路径分隔符
base_path = os.path.normpath(pattern.split("**")[0].rstrip(os.sep))

for full_path in glob.glob(pattern, recursive=True):
    rel_path = os.path.relpath(full_path, base_path)
    print(rel_path)

3. 命令行输入的处理要点

如果glob模式来自命令行参数,需注意:

  • 先清除参数可能带有的引号(部分shell会自动添加)
  • 分割**时仅取第一次出现的位置,避免模式中包含多个**的异常情况(递归匹配通常仅需一个**)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:00:27