Windows下OSError[WinError 206]根源是系统级MAX_PATH=260字符限制,需先启用注册表LongPathsEnabled并重启,再在Python中显式使用"?"前缀或os.chdir()缩短路径访问。
Windows下OSError: [WinError 206]的根源是什么
这个错误本质是Windows API对传统路径长度(MAX_PATH=260字符)的硬限制,不是Python本身的问题。当你用os.path.join()或open()操作深度嵌套目录、带长文件名的路径时,哪怕Python字符串本身合法,底层CreateFileW等系统调用仍会直接拒绝。
启用长路径支持前必须改注册表或组策略
仅靠Python代码无法绕过该限制——Windows默认禁用长路径支持。必须先让系统允许:
- 修改注册表项
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystemLongPathsEnabled,设为DWORD=1 - 或通过组策略:「计算机配置 → 管理模板 → 系统 → 文件系统 → 启用 Win32 长路径」设为已启用
- 改完需重启生效;不重启的话,新终端进程可能仍读不到变更
Python里真正起效的两种路径写法
注册表改完后,还需在代码中显式使用支持长路径的格式,否则旧路径写法依然触发错误:
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
- 用UNC前缀:
r"\?C:erylongpath oile.txt"—— 注意\?开头、原始字符串、盘符后跟 - 用相对路径配合
os.chdir()切换工作目录到靠近目标的位置,再用短路径访问 —— 适合批量处理同父目录下的文件 - 别用
os.path.abspath()自动补全路径后再传给open(),它生成的仍是普通格式,不带\?
示例:
import os # 错误:即使路径合法,仍可能触发WinError 206 open(r"C:erydeep estedolder..." + "x" * 200 + ".txt")正确:显式加?
with open(r"?C:erydeep estedolder..." + "x" * 200 + ".txt") as f: pass
跨平台脚本里别硬编码\?
\?是Windows专属机制,Linux/macOS不识别。如果脚本要多平台运行:
- 用
sys.platform == "win32"做条件判断,只在Windows下加前缀 - 避免用
pathlib.Path.resolve()直接拼长路径,它不自动转UNC;应手动检查长度是否超240(预留空间),再决定是否加前缀 - 第三方库如
pathlib2或pywin32不能替代注册表设置,它们只是封装,底层仍走同一套API
最易被忽略的是:注册表改了但没重启,或者用了\?却忘了用原始字符串(r""),导致反斜杠被转义成换行符之类——这时候报的错可能完全不相关,排查起来反而更费时间。