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

使用pathlib获取上级目录相对路径报错,如何替代os.path.relpath?

使用pathlib获取上级目录相对路径的解决方案

当需要从子目录路径获取上级目录的相对路径时,os.path.relpath可以直接实现,但pathlib.Path.relative_to()默认会报错——因为它要求目标路径是当前路径的子路径,反过来的情况不支持。下面是具体的问题复现和解决方法:

问题复现

os.path正常工作的示例

import os

p1 = "/a/b/c"
p2 = "/a/b/c/d/e"

os.path.relpath(p1, p2)  # 输出: '../..'

pathlib报错的示例

import pathlib

p1 = pathlib.Path("/a/b/c")
p2 = pathlib.Path("/a/b/c/d/e")

p1.relative_to(p2)
# 抛出异常: ValueError: '/a/b/c' is not in the subpath of '/a/b/c/d/e' OR one path is relative and the other is absolute.

解决方法

方法1:Python 3.12+ 直接使用walk_up参数

Python 3.12为relative_to()新增了walk_up=True参数,允许向上遍历获取相对路径,行为和os.path.relpath一致:

from pathlib import Path

p1 = Path("/a/b/c")
p2 = Path("/a/b/c/d/e")

rel_path = p1.relative_to(p2, walk_up=True)
print(rel_path)  # 输出: ../..

方法2:兼容旧Python版本(<3.12)

方式A:借助os.path.relpath转换

直接用os.path.relpath得到相对路径字符串,再转为Path对象:

from pathlib import Path
import os

p1 = Path("/a/b/c")
p2 = Path("/a/b/c/d/e")

rel_path_str = os.path.relpath(p1, p2)
rel_path = Path(rel_path_str)
print(rel_path)  # 输出: ../..

方式B:手动计算相对路径

通过对比路径的组成部分,计算需要向上的层级和剩余路径:

from pathlib import Path

p1 = Path("/a/b/c")
p2 = Path("/a/b/c/d/e")

# 找出两个路径的共同前缀部分
common_len = 0
for part1, part2 in zip(p1.parts, p2.parts):
    if part1 == part2:
        common_len += 1
    else:
        break

# 计算需要向上跳转的层级
up_levels = len(p2.parts) - common_len
# 拼接相对路径
rel_path = Path("../" * up_levels).joinpath(*p1.parts[common_len:])

print(rel_path)  # 输出: ../..

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:41:46