os.listdir触发NotADirectoryError: [Errno 20] 非目录报错的解决方法
执行os.listdir触发NotADirectoryError排查
复现场景
按如下流程编写代码执行时会触发指定报错:
- 导入os模块并配置目标路径变量:
import os data_batch_1_dir = os.path.join("/content/drive/MyDrive/cifar_data/cifar dataset/data_batch_1") - 执行统计路径下文件数量的代码行:
print('total training batch1 images:', len(os.listdir(data_batch_1_dir)))
程序抛出异常:NotADirectoryError: [Errno 20] Not a directory,报错提示传入方法的路径并非有效目录。
常见触发原因
- 最普遍的问题是传入
os.listdir()的路径实际指向单个普通文件而非文件夹。很多刚接触CIFAR10的开发者会误以为data_batch_1是存储拆分图像的目录,但实际上CIFAR10原生组织格式中,这个名称对应的是没有文件后缀的二进制序列化数据文件,直接把这个文件路径传给要求入参为目录的os.listdir(),必然会触发该类报错。 - 路径文本和实际存储的文件夹名不匹配。你配置的路径中
cifar dataset字段带有空格,如果实际云盘内的文件夹是无空格命名(如cifar_dataset),会导致路径层级拼接错误,最终定位到上级目录下恰好和data_batch_1重名的普通文件,也会出现同类报错。 - 缺少前置路径校验步骤,无法第一时间确认路径的实际属性。
排查与修正步骤
- 先在执行
os.listdir()前增加两行校验代码,明确路径的真实属性:
多数场景下会得到“路径存在但不是目录”的输出,对应前面提到的路径和实体错配问题。# 校验目标路径是否真实存在 print("路径存在性:", os.path.exists(data_batch_1_dir)) # 校验目标路径是否为有效目录 print("路径目录属性:", os.path.isdir(data_batch_1_dir)) - 调整路径指向:如果你的目标是统计拆分存为独立图像的batch1文件夹下的图片总数,需要把路径修改到实际存放图像文件的目录层级,不要把指向单个二进制数据文件的路径传入目录遍历方法。
- 逐段核对云盘内的实际文件夹命名,重点排查空格、下划线、大小写这类容易出现文本不一致的细节,避免路径拼接时跳转到错误层级。
内容的提问来源于stack exchange,提问作者M. Atif Altaf
相关产品推荐
相关产品推荐

