使用os.walk()遍历目录创建文件夹时触发文件名过长OSError的原因排查
异常出现的根本原因
os.walk 的遍历特性触发无限递归
os.walk 默认采用自顶向下的遍历逻辑,执行到任意层级目录时,会实时读取当前路径下的子目录列表,不会提前缓存初始扫描阶段的全量目录树。遍历过程中新建的目录,会被os.walk自动纳入后续的遍历流程,不受初始目录结构的限制。
对应你的代码,无限嵌套的完整执行流程为:
- 遍历到
./2013/2/路径时,读取到该目录下的子目录为ANAR - 代码识别到
ANAR为非数字命名,计算待创建路径为./2013/2/ANAR/ANAR,检测到路径不存在,通过os.mkdir执行创建操作 - 当前层目录处理完成后,
os.walk下钻进入./2013/2/ANAR/路径继续遍历,读取到该目录下的子目录为上一步刚创建的ANAR - 代码重复执行识别、计算路径、创建目录的逻辑,生成
./2013/2/ANAR/ANAR/ANAR - 不断重复下钻、新建目录的循环,直到路径长度超过系统允许的上限,触发“文件名过长”的
OSError
代码逻辑超出初始处理范围
你的初始需求是针对原有目录结构中存在的最内层非数字目录(即初始结构中的2013/1/ANAR、2013/2/ANAR)执行目录创建操作,但os.walk会将遍历过程中新建出来的ANAR目录也判定为待处理目标,对每一层新生成的ANAR都重复执行创建逻辑,最终形成无限嵌套的目录结构。
内容的提问来源于stack exchange,提问作者alireza niksejel
相关产品推荐
相关产品推荐

