Windows 报 WinError 206 路径太长?三种彻底解法

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 扩展、zipfileshutil 不一定生效——它们内部还在走 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 installnode_modules 层级太深 → 系统开 LongPathsEnabled + 项目挪到盘根

一句话总结

能开注册表就开、能加 \\?\ 就加、能挪盘根就挪。 三管齐下才彻底摆脱 WinError 206