我带过太多学员在自建数据集时卡在文件夹遍历上。
便是在今日,会一步一步地教你,运用 Python 之中的 os.listdir()、os.path.isdir()、os.path.join()这三件法宝,迅速地去检阅一番你的 F:pytorch 迁移学习 pokemon 数据集。
1. os.listdir():一眼看清文件夹里有什么

先给你个最简可运行代码,直接复制就能跑:
# 运行环境:Python 3.8+
# 无额外依赖,os 模块是 Python 自带
import os
root = r"F:pytorch 迁移学习 pokemon"
# r 前缀让反斜杠变成普通字符,避免转义坑
try:
# os.listdir()返回列表,每个元素是文件/文件夹的名字
items = os.listdir(root)
print("pokemon 下的所有内容:", items)
# 输出示例:['pikachu', 'charmander', 'data.csv', 'notes.txt']
# 注意:文件夹只显示名字不带后缀,文件会带后缀
except FileNotFoundError:
print(f"路径不存在:{root},请检查路径")
except PermissionError:
print(f"无权限访问:{root}")
学员曾踩过的实实在在的大坑是,有一回小李没写出绝对路径,直接运用 os.listdir("pokemon"),结果程序跑到系统桌面进行查找了。

避坑的技巧是,运用 os.path.abspath('.')之前,先生成打印当前工作的目录,以此来确认你所处的位置。
2. os.path.join():路径拼接的核心诀窍
很多新手在这栽跟头。
看代码:
# 企业级优化版:带边界处理和异常捕获
import os
def safe_join(base_path, sub_path):
"""
安全拼接路径
入参:base_path - 基础路径,sub_path - 要拼接的子路径
出参:拼接后的完整路径
"""
if not base_path or not isinstance(base_path, str):
raise ValueError("base_path 必须是有效字符串")
# os.path.join 从后往前读,遇到就停
full_path = os.path.join(base_path, sub_path)
return full_path
# 测试三种情况
root = r"F:pytorch 迁移学习 pokemon"
print(safe_join(root, "pikachu")) # F:pytorch 迁移学习 pokemonpikachu
print(safe_join(root, r"pikachu")) # 注意:以开头会出问题!
结果变成 pikachu
print(safe_join(root, "./pikachu")) # 带./会继续往前拼


关键的记忆点在于,os.path.join 这个操作,一旦碰到了符号,它就会将拼接的动作进行重置。
我带着学员所踩过的实实在在的坑:小王去写 os.path.join(root"train"),然而结果路径却变成了 train,并且前面的部分全都丢失不见了。
正确做法:拼接的部分不要以 开头。

3. os.path.isdir() + join():筛选文件夹的黄金组合
# 新手入门最简可运行版
import os
root = r"F:pytorch 迁移学习 pokemon"
# 先列出所有内容
all_items = os.listdir(root)
# 只保留文件夹
folders = []
for item in all_items:
# 关键:先用 join 拼出完整路径
full_path = os.path.join(root, item)
# 再判断这个完整路径是不是文件夹
if os.path.isdir(full_path):
folders.append(item)
print("数据集中的类别文件夹:", folders)
# 输出示例:['pikachu', 'charmander', 'squirtle']
企业级实战版:一键递归遍历所有子文件夹
import os
def scan_dataset(root_path):
"""
递归扫描数据集,返回所有图片文件路径
入参:root_path - 数据集根目录
出参:字典,键为类别名,值为图片路径列表
"""
dataset = {}
if not os.path.exists(root_path):
raise FileNotFoundError(f"{root_path}不存在")
for item in os.listdir(root_path):
full = os.path.join(root_path, item)
if os.path.isdir(full):
# 是文件夹,作为类别
images = []
for img in os.listdir(full):
img_path = os.path.join(full, img)
if os.path.isfile(img_path):
# 可加后缀过滤:if img.endswith(('.jpg','.png'))
images.append(img_path)
dataset[item] = images
return dataset
# 执行
pokemon_data = scan_dataset(r"F:pytorch 迁移学习 pokemon")
for cls, imgs in pokemon_data.items():
print(f"{cls}: {len(imgs)}张图片")

因小张直接运用 os.path.isdir(item)却未将路径完整拼接,故而永远返回 False,此乃学员曾踩过的坑。
避坑:isdir 判断的是完整路径,不是相对名字。

实际操作得出的总结内容为,listdir 所承担的职责是进行读取,join 所承担的职责是予以拼接,isdir 所承担的职责是开展筛选。
你运用这个组合拳,5 分钟便能够把 pokemon 文件夹里头的所有类别自动辨认出来,直接提供给 PyTorch 的 ImageFolder。

Comments NOTHING