在 Python 3.14 的 os.walk 中,删除 dirnames 里的目录名只可能影响尚未发生的向下递归,不会撤销已经生成或已经走过的子目录。若该目录在删除前已经被遍历,或者删除的并不是本次 yield 返回的原列表,日志里仍会出现它,这并不矛盾。这个判断针对 Windows 台式电脑上的 Python 3.14 标准库行为,不是把 Windows 文件接口当成 Python 规则。应先核对实际解释器版本和原调用,只读查看去敏代码、参数与已有顺序日志,不运行客户程序,也不改生产文件树。

AI台式电脑工作台示意图
AI台式电脑维护示意图,非真实门店、技师或客户实拍。

适用:适用于 topdown=True 时由调用者原地修改 yield 出的 dirnames 来控制随后递归的场景,也适用于 topdown=False 时子目录已经先生成的时序判断。关键不在目录是否被删掉,而在修改是否发生在 walk 继续向下之前、是否作用于原列表。

观察:第一步核对原调用,记录实际 Python 版本、topdown 和 followlinks 的取值,以及修改 dirnames 的代码位置;结果条件是 topdown=False 时当前目录三元组在子目录三元组之后才产生,此时再删名单,子目录已经先生成,不能影响已做的遍历。第二步核对列表身份,确认删除动作是否作用在本次 yield 出来的同一个 dirnames 对象上;结果条件是 dirnames = [...] 这类重新绑定只改变本地名字,不等于修改原列表,只有 del dirnames[...] 或切片赋值等原地修改才对应官方所说的原地剪枝。第三步核对已有顺序日志,看目标子目录的记录是否早于删除动作;结果条件是记录已出现在删除之前,就说明它已经生成或走过,删除只能阻止尚未发生的后续递归,不能倒推成没走过。第四步核对验证方式;结果条件是只用参数、列表身份和日志判断,不用删除真实目录来验证剪枝,避免改变观察对象。

风险:把重新赋值当成原地剪枝,会让代码以为跳过了目录而实际仍递归;在 topdown=False 下改 dirnames,子目录早已生成,剪枝意图落空;在已经走过之后才删除,日志与后续逻辑容易矛盾。若为验证再删除生产目录,还会改变文件树,使已有顺序日志失去参照。

下一步:准备去敏材料,包括实际 Python 版本、Windows 台式电脑环境、原 os.walk 调用及 topdown 参数、循环中修改 dirnames 的代码片段、修改是原地还是重新赋值、删除动作的位置,以及已有顺序日志中父目录和子目录的先后记录。不要提交敏感路径或生产数据。洛阳西工区用户可拨打 400-877-9605 咨询;电脑快修网是信息展示与第三方维修对接平台,400-877-9605只作咨询,实际范围和安排需确认。 这里从dirnames移除的是本轮遍历使用的名称,不是在磁盘上删除真实目录;不要把剪枝目的改成文件清理操作。