Python运行报File not found 如何读取脚本同目录下的资源文件
问题根因
Python中代码里写的裸相对路径,默认参照的是执行脚本时终端的工作目录,不是.py脚本文件自身的存放目录。
你训练脚本能正常读取文件,只是因为运行训练脚本时终端刚好处于脚本所在文件夹;运行主脚本时工作目录不在脚本文件夹下,就会触发File not found报错。
修复方案
不需要写死绝对路径,只要在代码里先获取当前脚本自身所在的绝对目录,再拼接目标文件名即可,不管项目拷到哪台电脑、从哪个路径启动脚本都能正常加载资源,完全满足作业提交、现场演示的需求。
具体修改步骤
- 在主脚本的导入区域新增os模块导入
- 定义脚本所在目录的常量
- 把所有文件加载的路径都改为基于该常量拼接的路径
- 修正主脚本里存在的缩进语法错误
修改后可直接使用的核心代码
首先在导入部分新增:
import os
在初始化lemmatizer之后、加载文件之前新增:
# 获取当前主脚本自身所在的文件夹绝对路径 BASE_DIR = os.path.dirname(os.path.abspath(__file__))
把原来的4行文件加载代码替换为:
intentii = json.loads(open(os.path.join(BASE_DIR, 'intentii.json'), 'r', encoding='utf-8').read()) cuvinte = pickle.load(open(os.path.join(BASE_DIR, 'cuvinte.pkl'), 'rb')) clase = pickle.load(open(os.path.join(BASE_DIR, 'clase.pkl'), 'rb')) model = load_model(os.path.join(BASE_DIR, 'chatbotmodel.h5'))
额外语法错误修正
你贴的主脚本里pachet_de_cuvinte函数存在缩进错误:
def pachet_de_cuvinte(sentence): sentence_cuvinte = clean_up_sentence(sentence) pachet = [0] * len(cuvinte) # 下一行前面多了4个空格,缩进不匹配,要删掉多余空格和上一行保持同级 for w in sentence_cuvinte: for i, cuvant in enumerate(cuvinte): if cuvant == w: pachet[i] = 1 return np.array(pachet)
把for w in sentence_cuvinte:前面多余的缩进删掉,否则运行时会直接报IndentationError语法错误。
内容的提问来源于stack exchange,提问作者Kileps
相关产品推荐
相关产品推荐

