Python创建目录后写入文件遇FileNotFoundError及路径过长问题求助
解决Python中文件写入的FileNotFoundError及长路径限制问题
我来帮你一步步拆解这两个头疼的问题~
一、先搞定FileNotFoundError的奇怪问题
你给出的代码逻辑本身是没问题的:先通过os.path.dirname(filename)拿到父目录,用os.makedirs创建(exist_ok=True还能避免重复创建的报错),再写入文件。但在原项目目录下报错、移到其他目录就正常,还能直接写入DWD_Data根目录,这说明问题大概率出在原项目目录的特定环境上,你可以按下面的步骤排查:
- 检查路径中是否有隐藏的特殊字符:有时候复制粘贴路径或手动输入时,会不小心带入全角空格、不可见控制字符(比如换行符)。你可以打印出
filename的原始字符串和长度,对比预期值:print(repr(filename)) # 用repr能显示出不可见字符 print(len(filename)) - 验证父目录是否真的被创建:在
os.makedirs之后,立刻检查父目录是否存在:
如果创建失败,可能是原目录的权限问题——比如原项目所在的文件夹是系统保护目录(比如parent_dir = os.path.dirname(filename) os.makedirs(parent_dir, exist_ok=True) print(os.path.exists(parent_dir)) # 正常应该输出True,如果是False,说明创建失败了C:\Program Files),或者当前Python进程没有写入权限。你可以右键原项目文件夹,检查「属性-安全」里的权限设置,确保当前用户有读写权限。 - 检查是否有杀毒软件/安全工具拦截:有些安全软件会阻止程序在特定目录创建子文件夹或写入文件,尤其是当原目录在系统盘根目录或者敏感位置时,可以暂时关闭安全工具测试一下。
二、路径长度超出MAX_PATH的解决方案
Windows默认的MAX_PATH限制是260字符(包含文件名),你的路径有288字符,确实会触发这个限制。这里有几个可靠的解决方法:
1. 使用Windows长路径前缀
在路径开头加上\\?\前缀,就能绕过MAX_PATH限制(注意路径必须是绝对路径)。你可以修改代码:
filename = os.path.join('DWD_Data', 'Stations', 'test.txt') # 转换成绝对路径并加上长路径前缀 long_filename = "\\\\?\\" + os.path.abspath(filename) os.makedirs(os.path.dirname(long_filename), exist_ok=True) with open(long_filename, "wb") as f: f.write(data)
不过要注意:这个方法只在Windows系统生效,跨平台代码需要做系统判断。
2. 修改注册表启用长路径支持
Windows 10 1607版本及之后、Windows 11支持通过注册表开启全局长路径支持,不需要加前缀:
- 打开注册表编辑器(运行
regedit),导航到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem - 找到
LongPathsEnabled键(如果没有就新建一个DWORD(32位)值),将其值设为1 - 重启电脑后生效,之后Python就能直接处理超过260字符的路径了
3. 缩短路径的替代方案
- 使用符号链接:把深层的文件夹创建一个符号链接到更浅的路径,比如在命令行执行:
然后代码里用mklink /D C:\short_link "C:\your\very\long\path\to\DWD_Data"C:\short_link代替原来的长路径。 - 重构目录结构:如果可能的话,把项目移到更浅的根目录下(比如从
C:\Users\YourName\Documents\Projects\Year2024\SubProject\...移到C:\Projects\...),直接缩短路径长度。
内容的提问来源于stack exchange,提问作者Lemar Schwarz




