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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:35:21