使用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
相关产品推荐
相关产品推荐

