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

