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

为何Python图片裁剪代码将文件写入上级目录而非指定cropped子目录?

问题原因

你的代码里,os.path.splitext(fullpath)返回的f是包含完整父路径的文件名(比如E:/images/projects/1/extracts/test),用它拼接保存路径时,会生成类似E:/images/projects/1/extracts/cropped/E:/images/projects/1/extracts/test.bmp的无效路径。Windows系统无法识别这种嵌套的绝对路径,会默认把文件保存到extracts目录下。

修正方案

需要从完整路径中提取仅文件名部分(不含上级路径),再拼接保存到cropped目录。以下是两种常用写法:

写法一:用os.path.basename提取文件名

修改代码中处理文件名和保存路径的部分:

from PIL import Image
import os.path, sys

path = "E:/images/projects/1/extracts"
dirs = os.listdir(path)

def crop():
    for item in dirs:
        fullpath = os.path.join(path,item)
        if os.path.isfile(fullpath):
            im = Image.open(fullpath)
            # 提取不带路径的文件名,再拆分后缀
            file_name = os.path.basename(fullpath)
            f, e = os.path.splitext(file_name)
            w, h = im.size
            imCrop = im.crop((0, 30, w, h-90))
            # 拼接正确的保存路径
            save_path = os.path.join(path, "cropped", f + '.bmp')
            imCrop.save(save_path, "BMP", quality=100)

crop()

写法二:用os.path.split拆分目录和文件名

from PIL import Image
import os.path, sys

path = "E:/images/projects/1/extracts"
dirs = os.listdir(path)

def crop():
    for item in dirs:
        fullpath = os.path.join(path,item)
        if os.path.isfile(fullpath):
            im = Image.open(fullpath)
            # 拆分出文件所在目录和文件名
            _, file_name = os.path.split(fullpath)
            f, e = os.path.splitext(file_name)
            w, h = im.size
            imCrop = im.crop((0, 30, w, h-90))
            imCrop.save(os.path.join(path, "cropped", f + '.bmp'), "BMP", quality=100)

crop()
额外提示

如果担心cropped目录可能不存在(比如误删),可以在crop函数开头添加目录创建逻辑,避免报错:

# 在crop函数开头加入
cropped_dir = os.path.join(path, "cropped")
os.makedirs(cropped_dir, exist_ok=True)

内容的提问来源于stack exchange,提问作者CarbonMan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:07:28