Windows下os.path.exists返回False但文件存在(MAX_PATH限制问题?)
解决Windows长路径在Python中无法识别的问题
碰到这种超过Windows MAX_PATH限制(260字符)的路径问题确实挺闹心的,我给你几个实用的解决方案,亲测有效:
方法1:给路径加Windows扩展前缀
Windows本身提供了扩展路径格式来绕过MAX_PATH的限制,不过要区分本地路径和UNC网络路径:
- 本地路径:直接在路径开头加
\\?\(Python里要写成原始字符串r'\\?\',或者转义成'\\\\?\\') - UNC网络路径:把原路径开头的
\\server\share改成\\?\UNC\server\share(比如你的路径,就要改成r'\\?\UNC\fgcz-biobeamer.uzh.ch\Data2San\...')
针对你的情况,修改后的代码应该是这样:
import os path = r'\\?\UNC\fgcz-biobeamer.uzh.ch\Data2San\p3061\Proteomics\TIMSTOF_1\spfammatter_20200317\3-17-2020_22-17-14_200ngHeLa_stdPASEF_100minGT__MSdataReduction_moderate_Rep1_520_1_Slot1-46.d\stdPASEF_100minGT_MSdataReduction_moderate_520.m\microTOFQImpacTemAcquisition.method' print(os.path.exists(path)) # 现在应该返回True了
方法2:用pathlib模块更省心
Python 3.4及以上自带的pathlib模块对长路径的支持更友好,它会自动处理很多细节,不用手动加前缀:
from pathlib import Path # 直接用原来的路径就行 path = Path(r'\\fgcz-biobeamer.uzh.ch\Data2San\p3061\Proteomics\TIMSTOF_1\spfammatter_20200317\3-17-2020_22-17-14_200ngHeLa_stdPASEF_100minGT__MSdataReduction_moderate_Rep1_520_1_Slot1-46.d\stdPASEF_100minGT_MSdataReduction_moderate_520.m\microTOFQImpacTemAcquisition.method') print(path.exists()) # 正常应该返回True
方法3:全局启用Windows长路径支持(一劳永逸)
如果不想每次都改代码,可以通过修改注册表让Windows全局支持长路径:
- 按下Win+R,输入
regedit打开注册表编辑器 - 导航到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem - 找到或新建一个名为
LongPathsEnabled的DWORD值,把它改成1 - 重启电脑后生效
这样设置后,Python的os模块和大部分Windows工具就能直接处理超长路径,不用再折腾前缀了。
方法4:直接调用Windows API(进阶方案)
要是上面的方法都不好使,还可以用ctypes直接调用Windows底层API来检查文件:
import ctypes from ctypes import wintypes def check_path_exists(path): GetFileAttributesW = ctypes.windll.kernel32.GetFileAttributesW GetFileAttributesW.argtypes = [wintypes.LPCWSTR] GetFileAttributesW.restype = wintypes.DWORD INVALID_ATTR = 0xFFFFFFFF attr = GetFileAttributesW(path) return attr != INVALID_ATTR # 用原来的路径测试 path = r'\\fgcz-biobeamer.uzh.ch\Data2San\p3061\Proteomics\TIMSTOF_1\spfammatter_20200317\3-17-2020_22-17-14_200ngHeLa_stdPASEF_100minGT__MSdataReduction_moderate_Rep1_520_1_Slot1-46.d\stdPASEF_100minGT_MSdataReduction_moderate_520.m\microTOFQImpacTemAcquisition.method' print(check_path_exists(path)) # 返回True说明文件存在
提醒一句:处理UNC路径的扩展前缀时别搞错格式,把原路径开头的\\换成\\?\UNC\就行,别加错位置哦。
内容的提问来源于stack exchange,提问作者witek
相关产品推荐
相关产品推荐

