Python子文件夹路径格式化:如何避免文件找不到错误(Error 2)
问题原因与优化方案
问题原因
你遇到的问题本质是混淆了Python中相对路径的解析规则:
Python里的相对路径(如./、../开头)是基于执行python命令时的当前工作目录来解析的,而非脚本文件本身的存储目录。这就导致两种运行场景下路径解析结果不一致:
- 在项目根目录执行
python main.py时,当前工作目录是根目录,此时script.py中./data/data.csv被解析为根目录下的对应路径(恰好匹配文件实际位置),所以运行正常。 - 直接执行
python script.py时(比如进入scripts目录后运行,或在根目录运行python scripts/script.py),当前工作目录发生变化,./data/data.csv的解析结果不再指向正确文件位置,因此报错;改成../data/data.csv后仅适配了直接运行script.py的场景,但运行main.py时,当前工作目录是根目录,../会指向根目录的上级目录,自然找不到文件。
补充说明:./指代当前工作目录,../指代当前工作目录的父目录,二者并非等价,路径层级必须结合当前工作目录判断。
优化方案
要让脚本在任何运行场景下都能正确找到文件,应基于脚本文件本身的存储目录构建绝对路径,彻底摆脱对当前工作目录的依赖。
方案1:修改script.py的路径逻辑
在script.py中通过__file__变量获取自身绝对路径,再拼接数据文件路径:
import os import pandas as pd # 获取script.py所在的绝对目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接data.csv的绝对路径 filepath = os.path.join(script_dir, 'data', 'data.csv') data_df = pd.read_csv(filepath)
os.path.abspath(__file__)会获取script.py的完整绝对路径,os.path.dirname()提取其所在目录,最后用os.path.join()拼接数据文件路径,确保无论在哪里运行脚本,路径都正确。
方案2:改用模块化导入(推荐)
不建议使用exec(open('./scripts/script.py').read())这种方式调用脚本,更符合Python规范的做法是将scripts目录转为模块,通过导入使用其功能:
- 在scripts目录下创建空的
__init__.py文件,将其标记为Python包。 - 修改script.py,将数据读取逻辑封装为函数:
import os import pandas as pd def load_data(): script_dir = os.path.dirname(os.path.abspath(__file__)) filepath = os.path.join(script_dir, 'data', 'data.csv') return pd.read_csv(filepath)
- 在main.py中导入并调用该函数:
from scripts.script import load_data data_df = load_data()
这种方式更易于维护、调试,也符合Python模块化设计思想。
内容的提问来源于stack exchange,提问作者MarcinKamil
相关产品推荐
相关产品推荐

