Python使用open()保存文件失败:提示目录不存在但目录实际存在
问题:无法保存指定文件名,报错目录不存在但实际存在
问题现象与排查结果:
- 程序报错提示目录不存在,但该目录实际已存在
- 可在资源管理器手动创建该文件→文件名合法
- 可在资源管理器手动创建该目录→目录名合法
- 将其他文件名(如
aaa.png)保存到该目录成功→路径合法、无权限问题、写入方式正常 - 该文件可写入上级目录
download_pictures→并非文件名本身问题
代码示例:
import os # 目标路径 path = 'download_pictures\\landscape[or]no people[or]nature[OrderBydata]\\' # 待保存的文件名 download_name = '[6]772803-2500x1459-genshin+impact-lumine+(genshin+impact)-arama+(genshin+impact)-aranara+(genshin+impact)-arabalika+(genshin+impact)-arakavi+(genshin+impact).png' filename = path + download_name print('文件名 = ', filename) # 确保目录存在 if not os.path.exists(path): os.makedirs(path) try: with open(filename, 'w') as f: f.write('test') except Exception as e: print('\n【错误!】第一次保存文件失败,捕获异常:', e) print(filename) # 测试修改文件名保存 filename = path + 'aaa.png' with open(filename, 'w') as f: print('\n第二次保存文件,修改文件名为aaa.png,路径不变') f.write('test') print(filename) # 测试修改目录保存原文件名 path = 'download_pictures\\' filename = path + download_name with open(filename, 'w') as f: print('\n第三次保存文件,文件名不变,修改目录为上级目录') f.write('test')
控制台输出(已翻译):
文件名 = download_pictures\landscape[or]no people[or]nature[OrderBydata]\[6]772803-2500x1459-genshin+impact-lumine+(genshin+impact)-arama+(genshin+impact)-aranara+(genshin+impact)-arabalika+(genshin+impact)-arakavi+(genshin+impact).png 【错误!】第一次保存文件失败,捕获异常: [Errno 2] 没有那个文件或目录: 'download_pictures\\landscape[or]no people[or]nature[OrderBydata]\\[6]772803-2500x1459-genshin+impact-lumine+(genshin+impact)-arama+(genshin+impact)-aranara+(genshin+impact)-arabalika+(genshin+impact)-arakavi+(genshin+impact).png' download_pictures\landscape[or]no people[or]nature[OrderBydata]\[6]772803-2500x1459-genshin+impact-lumine+(genshin+impact)-arama+(genshin+impact)-aranara+(genshin+impact)-arabalika+(genshin+impact)-arakavi+(genshin+impact).png 第二次保存文件,修改文件名为aaa.png,路径不变 download_pictures\landscape[or]no people[or]nature[OrderBydata]\aaa.png 第三次保存文件,文件名不变,修改目录为上级目录 进程结束,退出代码 0
解决方案:
问题根源是文件名中的特殊字符被Windows系统误解——方括号[]会被部分系统API解析为通配符(类似正则匹配规则),结合目录名里的[or]结构,导致系统无法正确识别实际文件路径。
可通过以下方式解决:
- 替换特殊字符:将文件名里的方括号
[]、加号+等易引发歧义的字符替换为下划线_:download_name = download_name.replace('[', '_').replace(']', '_').replace('+', '_') - 使用原始字符串定义路径:在路径字符串前加
r,避免转义字符干扰:path = r'download_pictures\landscape[or]no people[or]nature[OrderBydata]\' - 用
os.path.join拼接路径:避免手动拼接路径的格式问题,提升跨系统兼容性:filename = os.path.join(path, download_name)
组合修改后的代码示例:
import os # 使用原始字符串定义路径 path = r'download_pictures\landscape[or]no people[or]nature[OrderBydata]\' download_name = '[6]772803-2500x1459-genshin+impact-lumine+(genshin+impact)-arama+(genshin+impact)-aranara+(genshin+impact)-arabalika+(genshin+impact)-arakavi+(genshin+impact).png' # 替换特殊字符 download_name = download_name.replace('[', '_').replace(']', '_').replace('+', '_') # 使用os.path.join拼接路径 filename = os.path.join(path, download_name) print('处理后的文件名 = ', filename) # 确保目录存在 if not os.path.exists(path): os.makedirs(path) try: with open(filename, 'w') as f: f.write('test') print('保存成功') except Exception as e: print('\n【错误!】保存失败,捕获异常:', e)
内容的提问来源于stack exchange,提问作者konley
相关产品推荐
相关产品推荐

