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

Python用os.walk遍历目录报WinError3文件不存在但文件实际存在是什么原因?

问题原因
  • Windows默认长路径限制:Windows系统默认限制路径最大长度为260个字符,当遍历到嵌套层级很深、总路径长度超过260的文件/目录时,Python的os模块默认会抛出路径找不到的错误,而新版Windows文件资源管理器默认支持长路径,所以你手动可以正常访问对应文件,这是该报错最常见的诱因。
  • 遍历过程中文件状态变更:如果在os.walk遍历目录树的过程中,对应文件/目录被其他进程移动、删除或者重命名,也会出现调用os.path.getsize时找不到路径的报错,若你事后手动查找时文件已经被恢复,就会出现手动能找到但程序报错的情况。
  • 特殊目录跳转问题:Windows系统存在不少目录交接点(Junction)、符号链接,比如默认用户目录下的「我的音乐」「我的视频」这类目录很多是符号链接,os.walk如果跟随这类链接跳转,会生成实际不存在的虚拟路径,触发路径找不到错误。
  • 路径拼接的隐性错误:代码中重复调用os.path.abspath、混合使用os模块和Path对象拼接路径,在遇到文件名包含特殊字符(比如空格、生僻字符、系统保留字符)时,可能出现路径拼接异常,实际生成的路径和真实路径不一致,触发报错。
修复方案

你可以直接使用优化后的代码,适配上述所有异常场景:

import os
from pathlib import Path

# 适配Windows长路径限制
def get_long_path(path):
    return os.path.realpath(f'\\\\?\\{path}') if os.name == 'nt' else path

root_path = Path.home()
# 关闭符号链接跟随,避免访问虚拟路径
for foldername, subfolders, files in os.walk(root_path, followlinks=False):
    # 提前跳过无读取权限的目录,减少无效遍历
    if not os.access(foldername, os.R_OK):
        continue
    for file in files:
        try:
            full_path = Path(foldername) / file
            full_path_long = get_long_path(full_path)
            size = os.path.getsize(full_path_long)
            if size >= 100000000:
                print(f'{full_path} has size in bytes: {size}')
        # 异常捕获,遇到问题直接跳过不中断整体遍历
        except (FileNotFoundError, PermissionError):
            continue

内容的提问来源于stack exchange,提问作者MicSar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:45:03