Windows环境下Python调用glob.glob返回空列表问题排查
Windows环境下glob返回空列表修复方案
按以下顺序排查修复即可:
- 递归匹配参数缺失:Python内置
glob.glob()默认不开启递归遍历,路径中写**通配符不会自动匹配多层子目录,必须显式传入recursive=True参数,递归规则才会生效。 - 相对路径基准错误:
.ipynb的运行工作目录(Python进程启动时的当前路径)和ipynb文件的存储路径不一定一致。你写的code/Datasets/...是相对路径,会从当前工作目录开始寻址,如果工作目录不对,哪怕路径拼写正确也找不到文件。 - 后缀/格式匹配问题:glob默认大小写敏感,如果图片后缀是大写
.JPG、.JPEG,写*.jpg会匹配失败;Windows原生路径用反斜杠,混合斜杠写法偶尔会触发匹配异常。
先确认当前工作目录
先在notebook单元格运行以下代码,查看当前实际工作路径:
import os print(os.getcwd())
如果输出的路径不是code文件夹所在的父目录,先切换到正确路径,或者直接写文件的绝对路径:
# 替换为你本地code文件夹所在的实际父目录,比如code存放在D:/ml_project下就填这个路径 os.chdir("D:/ml_project")
举个例子:如果你的文件结构是
D:/ml_project/code/xxx.ipynb、D:/ml_project/code/Datasets/train/...,那工作目录就要切到D:/ml_project,你之前写的code/Datasets/train/**/*.jpg路径才是对的;如果工作目录切到了code文件夹内部,路径就要改成Datasets/train/**/*.jpg。
修正glob调用代码
开启递归参数后的可运行代码如下:
import glob train_dir = "code/Datasets/train/**/*.jpg" test_dir = "code/Datasets/test/**/*.jpg" train_files = glob.glob(train_dir, recursive=True) test_files = glob.glob(test_dir, recursive=True) print(f"训练集匹配到文件数:{len(train_files)}") print(f"测试集匹配到文件数:{len(test_files)}")
兼容性更好的兜底写法
如果上述代码还是匹配失败,直接用标准库pathlib做路径匹配,对Windows路径适配更好,不需要手动处理斜杠问题:
from pathlib import Path # 替换为Datasets文件夹的实际路径 dataset_root = Path("code/Datasets") # 同时匹配jpg、jpeg、JPG、JPEG后缀 train_files = list(dataset_root.glob("train/**/*.[jJ][pP][eE]*[gG]")) test_files = list(dataset_root.glob("test/**/*.[jJ][pP][eE]*[gG]"))
内容的提问来源于stack exchange,提问作者Anefu
相关产品推荐
相关产品推荐

