Python包内引用非Python文件触发FileNotFoundError如何解决?
问题原因
你使用的是相对于当前工作目录的相对路径,当你从项目根目录运行main.py时,Python的工作目录是main.py所在的根目录,相对路径dataFiles/brands.txt会被解析为[根目录]/dataFiles/brands.txt,但文件实际存放在SuperMarket包目录下,因此触发文件不存在报错。
修复方案
通过当前Python文件的内置变量__file__定位目标文件的绝对路径,步骤如下:
- 第一步:在brands.py文件开头导入依赖模块
import os import csv # 若原有代码已经导入csv可忽略这行
- 第二步:修改文件打开的路径拼接逻辑,修改后的完整代码如下:
class Brands: def getBrandsData(self, b_id=False, name=False): """:returns a list containing all brand data based on parameters""" data = [] # 计算brands.txt的绝对路径 current_dir = os.path.dirname(os.path.abspath(__file__)) brands_file_path = os.path.join(current_dir, 'dataFiles', 'brands.txt') with open(brands_file_path, 'r') as file: reader = csv.reader(file, delimiter='|') for row in reader: subData = [] if b_id: subData.append(row[0]) if name: subData.append(row[1]) data.append(subData) if [b_id, name].count(True) == 1: data = [item for sublist in data for item in sublist] return data
Python3.4+可选简化方案
使用pathlib模块实现更简洁的路径拼接:
from pathlib import Path import csv class Brands: def getBrandsData(self, b_id=False, name=False): """:returns a list containing all brand data based on parameters""" data = [] brands_file_path = Path(__file__).parent / 'dataFiles' / 'brands.txt' with open(brands_file_path, 'r') as file: reader = csv.reader(file, delimiter='|') for row in reader: subData = [] if b_id: subData.append(row[0]) if name: subData.append(row[1]) data.append(subData) if [b_id, name].count(True) == 1: data = [item for sublist in data for item in sublist] return data
内容的提问来源于stack exchange,提问作者SARIN ALEXANDER
相关产品推荐
相关产品推荐

