Python保存图片提示No such file or directory但目录存在的问题排查
问题描述
尝试将图片保存到指定目录,已通过os.makedirs(gallery_folder_path, exist_ok=True)确保目录创建,且手动确认目录存在,但仍触发FileNotFoundError。相关代码、控制台输出及文件名清理函数如下:
核心代码
image_content = image_response.content image_filename = sanitize_filename(item['caption']) # 获取画廊文件夹 gallery_folder = sanitize_filename(soup.find(class_="mw-page-title-main").text) gallery_folder_path = os.path.normpath(os.path.join('gallery', gallery_folder)) # 确保目录存在 os.makedirs(gallery_folder_path, exist_ok=True) # 构建完整图片路径 image_path = os.path.join(gallery_folder_path, f'{image_filename}.jpg') # 调试输出 print(f"image_filename: {image_filename}") print(f"gallery_folder: {gallery_folder}") print(image_path) input() with open(image_path, 'wb') as file: file.write(image_content)
控制台输出
image_filename: The_Farm_by_Jean-Baptiste_Oudry_1750_oil_on_canvas_130_x_212_cm_Louvre._This_Rococo_painting_shows_how_Cottagecore_visuals_are_a_continuation_of_depictions_of_the_traditional_French_and_English_countryside gallery_folder: Cottagecore gallery\Cottagecore\The_Farm_by_Jean-Baptiste_Oudry_1750_oil_on_canvas_130_x_212_cm_Louvre._This_Rococo_painting_shows_how_Cottagecore_visuals_are_a_continuation_of_depictions_of_the_traditional_French_and_English_countryside.jpg Traceback (most recent call last): File "C:\Users\PC GAMER\Desktop\Devs\python\scrappers\tvtropes_scrapper\test.py", line 76, in <module> with open(image_path, 'wb') as file: FileNotFoundError: [Errno 2] No such file or directory: 'gallery\\Cottagecore\\The_Farm_by_Jean-Baptiste_Oudry_1750_oil_on_canvas_130_x_212_cm_Louvre._This_Rococo_painting_shows_how_Cottagecore_visuals_are_a_continuation_of_depictions_of_the_traditional_French_and_English_countryside.jpg'
文件名清理函数
def sanitize_filename(filename): # 移除文件名中的无效字符 valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits) sanitized_filename = ''.join(c for c in filename if c in valid_chars) sanitized_filename = sanitized_filename.replace('/', '_') # 将正斜杠替换为下划线 sanitized_filename = sanitized_filename.replace(' ', '_') # 将空格替换为下划线 return sanitized_filename
排查与解决思路
核心原因:文件名(含路径)超出系统长度限制
Windows系统默认限制文件路径总长度为260字符(包含文件名和所有父目录)。你的image_path总长度远超该限制,导致系统无法识别路径,即使目录实际存在,仍会抛出FileNotFoundError。
解决方法
1. 缩短文件名(推荐)
修改sanitize_filename函数,对过长文件名进行截断或简化,同时保证文件名唯一性:
def sanitize_filename(filename): valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits) sanitized_filename = ''.join(c for c in filename if c in valid_chars) sanitized_filename = sanitized_filename.replace('/', '_') sanitized_filename = sanitized_filename.replace(' ', '_') # 限制文件名最大长度,避免路径超限 max_filename_length = 100 if len(sanitized_filename) > max_filename_length: import hashlib # 用原文件名的哈希值后缀保证唯一性 name_hash = hashlib.md5(sanitized_filename.encode()).hexdigest()[:8] sanitized_filename = f"{sanitized_filename[:max_filename_length-9]}_{name_hash}" return sanitized_filename
2. 启用Windows长路径支持(系统级设置)
若不想修改代码,可通过系统设置解除路径长度限制:
- 打开注册表编辑器,导航到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem - 找到
LongPathsEnabled项,将其值改为1(若不存在则新建DWORD(32位)值) - 重启电脑生效
内容的提问来源于stack exchange,提问作者Adam Demo_Fighter
相关产品推荐
相关产品推荐

