Python 里跑数据集处理,Windows 突然崩:
FileNotFoundError: [WinError 206] 文件名或扩展名太长。:
'cache\\vendor\\dataset_2026\\...\\CAM_FRONT_WIDE_H110_HR\\virtual_image'
不是数据太大,是这个路径字符串太长——超过了 Windows 老古董的 MAX_PATH = 260 限制。分批读取、分段处理、分次遍历都没用,open() 那一刻就已经炸了。
方案一:开注册表长路径支持(一次性)
Windows 10/11 内核其实支持长路径,但默认关着。管理员 PowerShell:
New-ItemProperty `
-Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" `
-Name "LongPathsEnabled" `
-Value 1 `
-PropertyType DWORD `
-Force
或 CMD:
reg add HKLM\SYSTEM\CurrentControlSet\Control\FileSystem ^
/v LongPathsEnabled /t REG_DWORD /d 1 /f
重启电脑,或者至少重启 Python / IDE 让新进程读到设置。
注意:仅这一步对某些老 Python API、部分 C 扩展、zipfile、shutil 不一定生效——它们内部还在走 260 限制的老 API。
方案二:\\?\ 前缀(最稳)
Windows 内核 API 支持超长路径,但要显式加 \\?\ 前缀:
import os
def win_long_path(path: str) -> str:
"""把路径转成支持超长的形式"""
p = os.path.abspath(path)
if not p.startswith("\\\\?\\"):
p = "\\\\?\\" + p
return p
with open(win_long_path(long_path)) as f:
...
关键点:
- 必须是绝对路径,
\\?\不认相对路径 - 全程用反斜杠
\,不能混用正斜杠 - UNC 路径(
\\server\share\...)要写成\\?\UNC\server\share\...
这是数据管线、爬虫抓文件时最常用的做法,不依赖系统设置。
方案三:从源头缩短
工程上最优雅的还是让路径变短,两个方向:
把项目往盘根挪
D:\workspace\company_project\data\cache\... ❌
D:\d\cache\... ✅ 少几十字符
缩短目录命名
自动生成的目录名往往长得离谱:
CAM_PBQ_FRONT_WIDE_RESET_OPTICAL_H110_HR ❌
CAM1 ✅
用一个 mapping 文件记录原名 → 短名即可。
npm / git 也会踩
不止 Python:
-
git clone遇到超深仓库 → 加:git config --system core.longpaths true -
npm install/pnpm install的node_modules层级太深 → 系统开LongPathsEnabled+ 项目挪到盘根
一句话总结
能开注册表就开、能加 \\?\ 就加、能挪盘根就挪。 三管齐下才彻底摆脱 WinError 206。
