You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python os.walk遍历Windows目录时遇名称为"_"的文件夹出现阻塞问题求助

Python os.walk遍历Windows目录时遇名称为"_"的文件夹出现阻塞问题求助

看起来你遇到了个挺棘手的目录遍历问题,我来帮你一步步分析可能的原因和解决办法~

一、先排查「_」文件夹本身的异常

程序一碰到这个文件夹就卡住,首先得排除这个文件夹自身的问题:

  • 手动打开「_」文件夹看看:里面是不是有超大量文件(比如几十万甚至上百万个)?如果是这样,控制台print的速度远跟不上文件处理速度,会让你误以为程序阻塞了,实际它还在后台运行。
  • 检查文件夹权限:当前运行Python的用户有没有这个文件夹的读取权限?Windows下有时候系统锁定的文件夹或权限受限的目录会导致访问卡住。
  • 检查路径长度:这个文件夹里的文件路径是不是超过了Windows默认的260字符限制?超过的话os模块的很多操作会出现异常。

二、你的代码里的潜在问题(大概率是卡住的真因)

看了你的代码,有几个地方容易导致异常甚至阻塞:

  1. 手动拼接路径的风险:你用"{}".format(dirpath)+'\\'+ i来拼接路径,这种写法在遇到带特殊字符的路径(比如空格、法语重音)时容易出错,用os.path.join才是跨平台且安全的标准写法。
  2. 无异常捕获的元数据读取:os.path.getmtime这一步如果碰到无法访问的文件(比如被锁定、权限不足、文件已被删除),会直接抛出异常,而你的代码没有捕获异常,会导致程序直接中断(看起来像阻塞)。
  3. 列表操作的低效写法:你用extend([xxx])来添加单个元素,这比直接用append(xxx)效率低很多,在处理17000个文件夹的场景下,会拖慢程序运行速度。
  4. 扩展名处理的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')

四、进一步的排查建议

  1. 关闭控制台输出测试:如果「_」文件夹里有大量文件,print的速度会极慢,看起来像阻塞。你可以暂时注释掉所有print语句,或者用logging模块把日志写入文件,看看程序会不会正常结束。
  2. 单独测试「_」文件夹:把mypath直接设为这个「_」文件夹的路径,运行代码,看是不是真的卡住,这样可以缩小问题范围。
  3. 尝试用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')
  1. 启用Windows长路径支持:如果你的路径超过260字符,可以在代码开头加入以下代码(需要Windows 10 1607以上版本):
# 启用长路径支持
os.environ['PYTHONLEGACYWINDOWSFSENCODING'] = 'utf-8'

五、为什么之前的目录能正常遍历?

之前的目录没有「」文件夹,可能刚好没有触发这些隐藏的问题(比如没有路径过长的文件、没有权限不足的文件),而「」文件夹里刚好存在这些触发点。

试试上面的方法,应该能解决你的问题,如果还有疑问可以告诉我具体的错误信息哦~

备注:内容来源于stack exchange,提问作者krm267

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:34:50