You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动