Python中已知文件路径后缀与基础目录,如何获取绝对路径?
这个需求我之前也碰到过,用Python自带的工具就能轻松解决,给你两个实用的实现方案,按需选就行:
方案1:用os模块(高效直观)
这个方法的核心是遍历基础目录下的所有子目录,逐个检查当前目录下是否存在你要找的目标路径后缀对应的文件,找到就返回绝对路径,效率比遍历所有文件要高。
import os def find_absolute_path(end_path: str, base_dir: str) -> str | None: # 先把基础目录转成绝对路径,避免相对路径的坑 base_dir_abs = os.path.abspath(base_dir) # 标准化目标路径,处理不同系统的路径分隔符差异 end_path_norm = os.path.normpath(end_path) # 递归遍历基础目录下的所有子目录 for root, _, _ in os.walk(base_dir_abs): # 拼接当前目录和目标路径后缀,生成候选文件路径 candidate_path = os.path.join(root, end_path_norm) # 检查这个路径是不是真实存在的文件 if os.path.isfile(candidate_path): # 返回绝对路径字符串 return os.path.abspath(candidate_path) # 遍历完没找到就返回None return None
方案2:用pathlib(现代路径操作风格)
如果你喜欢pathlib的面向对象写法,这个版本更符合Python3的风格:
from pathlib import Path def find_absolute_path(end_path: str, base_dir: str) -> str | None: base_path = Path(base_dir).resolve() # 转成绝对路径的Path对象 end_path_obj = Path(end_path) # 递归遍历基础目录下的所有子目录 for dir_path in base_path.rglob('*'): if dir_path.is_dir(): # 拼接目录和目标路径后缀 candidate_path = dir_path / end_path_obj if candidate_path.is_file(): return str(candidate_path.resolve()) return None
怎么用?
完全贴合你需求里的场景,直接循环调用就行:
import cv2 list_of_paths = [ 'sub_folder1/file1.txt', 'sub_folder2/file120.txt', 'sub_folder78/file99.txt' ] base_dir = '/path/to/your/actual/base_dir' # 替换成你的真实基础目录 for end_path in list_of_paths: full_path = find_absolute_path(end_path, base_dir) if full_path: # 这里注意你例子里写的是txt文件,但cv2是读图像的,应该是笔误吧? image = cv2.imread(full_path) # 接下来处理你的图像逻辑... else: print(f"警告:找不到对应文件 -> {end_path}")
额外说明
- 两个函数都会返回第一个匹配到的文件,如果你的基础目录下有多个相同后缀路径的文件(比如两个不同中间目录下都有
sub_folder1/file1.txt),只会返回最先遍历到的那个。如果需要返回所有匹配结果,把return改成把路径添加到列表里,最后返回列表就行。 - 函数里做了路径标准化和绝对路径转换,兼容Windows、Linux、macOS的路径分隔符差异。
- 如果某个后缀路径对应的文件不存在,函数会返回None,记得在调用时做判断,避免后续报错。
内容的提问来源于stack exchange,提问作者NeStack
相关产品推荐
相关产品推荐

