Python被导入工具脚本如何使用相对自身路径读取资源文件
Python包内相对路径访问资源无拼接解决方案
Python的相对路径默认始终相对于运行时的当前工作目录(CWD),不存在原生的“自动以当前py文件所在目录为基准解析相对路径”的语法,以下是无需手动拼接os.path.dirname(__file__)的可行实现方案:
方案1:使用标准库importlib.resources(推荐,Python 3.7+支持)
这是Python官方推荐的包内资源访问方式,完全基于包的导入结构定位文件,不需要手动拼接任何路径,兼容打包、虚拟环境等各类场景:
修改clean_data.py代码如下:
import pandas as pd from importlib.resources import files # 导入存放数据的子包 import utils.data def get_data(path=None): if not path: # 直接通过包结构定位data.csv data_path = files(utils.data).joinpath("data.csv") data = pd.read_csv(data_path) else: data = pd.read_csv(path) return data
注意:需要在
utils/data目录下新增空白的__init__.py文件,将目录标记为Python可导入的包。
方案2:临时切换工作目录(仅作参考,不推荐长期使用)
如果完全不想修改clean_data.py的原有代码,可以只修改外层main.py,在调用函数前临时切换工作目录到utils文件夹,调用完成后自动切回原目录:
import os from contextlib import contextmanager from utils.clean_data import get_data # 定义切换工作目录的上下文管理器 @contextmanager def switch_cwd(target_path): original_cwd = os.getcwd() os.chdir(target_path) try: yield finally: os.chdir(original_cwd) # 临时切换工作目录后调用函数 with switch_cwd("./utils"): data = get_data()
该方案的缺点是会影响clean_data.py内所有路径逻辑的解析,仅适合临时测试使用。
内容的提问来源于stack exchange,提问作者CutePoison
相关产品推荐
相关产品推荐

