Python os.walk遍历Windows目录时遇名称为"_"的文件夹出现阻塞问题求助
Python os.walk遍历Windows目录时遇名称为"_"的文件夹出现阻塞问题求助
看起来你遇到了个挺棘手的目录遍历问题,我来帮你一步步分析可能的原因和解决办法~
一、先排查「_」文件夹本身的异常
程序一碰到这个文件夹就卡住,首先得排除这个文件夹自身的问题:
- 手动打开「_」文件夹看看:里面是不是有超大量文件(比如几十万甚至上百万个)?如果是这样,控制台
print的速度远跟不上文件处理速度,会让你误以为程序阻塞了,实际它还在后台运行。 - 检查文件夹权限:当前运行Python的用户有没有这个文件夹的读取权限?Windows下有时候系统锁定的文件夹或权限受限的目录会导致访问卡住。
- 检查路径长度:这个文件夹里的文件路径是不是超过了Windows默认的260字符限制?超过的话os模块的很多操作会出现异常。
二、你的代码里的潜在问题(大概率是卡住的真因)
看了你的代码,有几个地方容易导致异常甚至阻塞:
- 手动拼接路径的风险:你用
"{}".format(dirpath)+'\\'+ i来拼接路径,这种写法在遇到带特殊字符的路径(比如空格、法语重音)时容易出错,用os.path.join才是跨平台且安全的标准写法。 - 无异常捕获的元数据读取:
os.path.getmtime这一步如果碰到无法访问的文件(比如被锁定、权限不足、文件已被删除),会直接抛出异常,而你的代码没有捕获异常,会导致程序直接中断(看起来像阻塞)。 - 列表操作的低效写法:你用
extend([xxx])来添加单个元素,这比直接用append(xxx)效率低很多,在处理17000个文件夹的场景下,会拖慢程序运行速度。 - 扩展名处理的bug:
'.'+i.split('.')[-1]如果碰到没有扩展名的文件(比如README),会错误地把整个文件名当扩展名,变成.README,用os.path.splitext才是正确的处理方式。
三、修复后的代码(带异常捕获和安全路径处理)
我给你修改了代码,加入了异常捕获、安全路径拼接,还优化了性能:
import os import datetime mypath = input('Chemin source : ') f, d, t, e = [], [], [], [] for dirpath, dirnames, filenames in os.walk(mypath): print(f"当前遍历目录: {dirpath}") for filename in filenames: print(f"正在处理文件: {filename}") # 用os.path.join安全拼接路径,避免手动拼接的错误 full_file_path = os.path.join(dirpath, filename) try: # 记录文件夹路径 d.append(dirpath) # 记录文件名 f.append(filename) # 获取文件修改时间(用os.path.getmtime处理完整路径) mtime = os.path.getmtime(full_file_path) t.append(datetime.date.fromtimestamp(mtime)) # 处理文件扩展名(兼容无扩展名的情况) ext = os.path.splitext(filename)[1] e.append(ext if ext else "") except Exception as error: # 捕获所有异常,打印错误信息后继续遍历其他文件 print(f"处理文件 {full_file_path} 时出错: {str(error)}") continue print('done')
四、进一步的排查建议
- 关闭控制台输出测试:如果「_」文件夹里有大量文件,
print的速度会极慢,看起来像阻塞。你可以暂时注释掉所有print语句,或者用logging模块把日志写入文件,看看程序会不会正常结束。 - 单独测试「_」文件夹:把
mypath直接设为这个「_」文件夹的路径,运行代码,看是不是真的卡住,这样可以缩小问题范围。 - 尝试用pathlib替代os.walk:pathlib是Python 3.4+的标准库,处理路径更优雅,也能避免一些os模块的坑,试试下面的代码:
from pathlib import Path import datetime mypath = Path(input('Chemin source : ')) f, d, t, e = [], [], [], [] # rglob('*')会遍历所有子目录下的文件 for file_path in mypath.rglob('*'): if file_path.is_file(): print(f"处理文件: {file_path}") d.append(str(file_path.parent)) f.append(file_path.name) # 用pathlib的stat方法获取修改时间 t.append(datetime.date.fromtimestamp(file_path.stat().st_mtime)) e.append(file_path.suffix) print('done')
- 启用Windows长路径支持:如果你的路径超过260字符,可以在代码开头加入以下代码(需要Windows 10 1607以上版本):
# 启用长路径支持 os.environ['PYTHONLEGACYWINDOWSFSENCODING'] = 'utf-8'
五、为什么之前的目录能正常遍历?
之前的目录没有「」文件夹,可能刚好没有触发这些隐藏的问题(比如没有路径过长的文件、没有权限不足的文件),而「」文件夹里刚好存在这些触发点。
试试上面的方法,应该能解决你的问题,如果还有疑问可以告诉我具体的错误信息哦~
备注:内容来源于stack exchange,提问作者krm267
相关产品推荐
相关产品推荐

