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
相关产品推荐
相关产品推荐

