You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:43:17