Python 3.8+:基于指定路径解析相对/绝对路径(不切换当前目录)
Python 3.8+ 解析基于指定路径的绝对路径方法
问题描述
给定一个可能为绝对或相对路径的path_to_resolve,需要在不改变当前工作目录的前提下,基于另一个给定路径relative_to解析出它的绝对路径(若原路径为相对路径)。当前工作目录假设为/cwd,预期行为示例如下:
def resolve_path (relative_to, path_to_resolve): ??? # 预期输出 resolve_path(".", "a/relative/path") # --> returns /cwd/a/relative/path resolve_path("example", "a/relative/path") # --> returns /cwd/example/a/relative/path resolve_path("/some/path", "a/relative/path") # --> returns /some/path/a/relative/path resolve_path("/some/path", "..") # --> returns /some resolve_path("/some/path", "/an/absolute/path") # --> returns /an/absolute/path resolve_path("/some/path", "/.") # --> returns /
解决方案
Python 3.8+ 可以通过os.path或pathlib模块实现该需求,两种方法如下:
1. 使用os.path模块
通过组合路径处理函数实现逻辑:先判断目标路径是否为绝对路径,是则直接规范化返回;否则将基准路径转为绝对路径,拼接后再规范化处理。
import os def resolve_path(relative_to, path_to_resolve): if os.path.isabs(path_to_resolve): return os.path.normpath(path_to_resolve) abs_base = os.path.abspath(relative_to) return os.path.normpath(os.path.join(abs_base, path_to_resolve))
2. 使用pathlib模块(推荐)
pathlib是Python 3.4+引入的面向对象路径处理模块,代码更简洁直观,Path.resolve()方法会自动处理路径中的.和..符号,返回规范化的绝对路径。
from pathlib import Path def resolve_path(relative_to, path_to_resolve): target_path = Path(path_to_resolve) if target_path.is_absolute(): return str(target_path.resolve()) base_path = Path(relative_to).resolve() return str((base_path / target_path).resolve())
两种方法都能满足示例中的所有预期输出,pathlib的写法更符合现代Python的编码习惯。
内容的提问来源于stack exchange,提问作者Jason C
相关产品推荐
相关产品推荐

