为何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
相关产品推荐
相关产品推荐

