如何用Python的pathlib获取未知路径父目录的相对路径?
根据目录名称获取相对路径(基于pathlib)
我们知道用pathlib.Path.relative_to()可以快速获取相对于完整父路径的相对路径:
>>> from pathlib import Path >>> Path("/path/to/foo/bar/thing").relative_to("/path/to/foo") PosixPath('bar/thing')
但如果只知道目标父目录的名称(不知道完整路径),比如要从任意路径中提取相对于某个同名目录的子路径,就需要自定义逻辑来实现。比如:
/path/to/foo/bar/thing相对于foo→bar/thing/path/to/foo/bar/thing相对于to→foo/bar/thing/another_path/to/foo/bar/thing相对于foo→bar/thing
实现方案
核心思路是:遍历目标路径的所有父节点,找到第一个名称匹配目标目录的节点,再用relative_to()获取相对路径。如果有多个同名目录,默认取离当前路径最近的那个父目录。
from pathlib import Path def relative_to_dir_name(path: Path, dir_name: str) -> Path: # 遍历路径的所有父节点(从近到远) for parent in path.parents: if parent.name == dir_name: return path.relative_to(parent) # 未找到匹配目录时抛出异常,和pathlib原生方法行为一致 raise ValueError(f"路径 {path} 中不存在名为 {dir_name} 的目录")
测试示例
# 测试案例1 p1 = Path("/path/to/foo/bar/thing") print(relative_to_dir_name(p1, "foo")) # 输出: bar/thing print(relative_to_dir_name(p1, "to")) # 输出: foo/bar/thing # 测试案例2 p2 = Path("/another_path/to/foo/bar/thing") print(relative_to_dir_name(p2, "foo")) # 输出: bar/thing
扩展说明
如果需要匹配最上层的同名目录(而非最近的),只需将遍历顺序反转即可:
def relative_to_top_dir_name(path: Path, dir_name: str) -> Path: # 反转父节点顺序,从根目录方向开始查找 for parent in reversed(list(path.parents)): if parent.name == dir_name: return path.relative_to(parent) raise ValueError(f"路径 {path} 中不存在名为 {dir_name} 的目录")
比如路径/a/foo/b/foo/d,用这个函数查找foo会返回b/foo/d,而不是d。
内容的提问来源于stack exchange,提问作者william_grisaitis
相关产品推荐
相关产品推荐

