Windows本地训练模型遇IndexError: list index out of range问题求助
问题原因
你的错误根源有两个:
- 硬编码索引[3]:Linux和Windows的路径结构存在差异,导致路径拆分后的列表长度不一致,固定索引会直接引发越界。比如Linux下相对路径
./data/train/class1拆分后是['.', 'data', 'train', 'class1'],索引3对应类名;但Windows下glob可能返回绝对路径(如E:\Project\data\train\class1),拆分后是['E:', 'Project', 'data', 'train', 'class1'],索引3是train而非类名,若路径结构不符合预期,还会直接出现列表长度不足3的情况,触发索引越界。 - 依赖路径分隔符的拆分逻辑:即便用了
os.path.sep,固定索引依然无法适配不同系统的路径层级。
解决方案
放弃固定索引提取类名,改用跨平台的路径处理方法直接获取文件夹名称,推荐两种实用方式:
方法1:用os.path.basename()(兼容所有Python版本)
修改data_utils.py中的labels_to_number函数:
import os import glob def labels_to_number(path): # 用os.path.join拼接路径,避免手动加分隔符的跨平台问题 class_paths = glob.glob(os.path.join(path, '*')) # 提取每个路径的最后一级文件夹名,同时过滤非文件夹项 classes = [os.path.basename(p) for p in class_paths if os.path.isdir(p)] classes.sort() labels_dict = {label: idx for idx, label in enumerate(classes)} return labels_dict
方法2:用pathlib(Python 3.4+ 更简洁)
from pathlib import Path def labels_to_number(path): path_obj = Path(path) # 直接遍历路径下的子目录 class_dirs = [d for d in path_obj.iterdir() if d.is_dir()] # 提取目录名并排序 classes = sorted([d.name for d in class_dirs]) labels_dict = {label: idx for idx, label in enumerate(classes)} return labels_dict
pathlib是Python 3官方推荐的面向对象路径处理方式,代码更简洁且天然适配跨平台场景。
额外注意事项
- 确认
./data/train/目录下确实存在类文件夹,无空目录或不符合预期的文件; - 主文件中的
TRAIN_PATH可保持不变,但建议后续用os.path.join()或pathlib拼接路径,避免手动写分隔符引发的问题。
内容的提问来源于stack exchange,提问作者abrar
相关产品推荐
相关产品推荐

