使用shutil移动带扩展名文件异常:仅创建文件夹未移动文件求助
问题排查与修复方案
你的代码存在几个关键问题,导致文件未被移动,以下是具体分析和修复:
1. 缩进错误(Python语法核心问题)
Python依赖缩进区分代码块,你的代码多处缩进违规:
remove_ext函数内的return语句未缩进,函数逻辑无法正常执行path = os.getcwd()前有多余空格,属于语法错误for循环和if判断后的shutil.move语句未缩进,这部分代码不会被循环触发执行
2. 文件扩展名不匹配
你用glob.glob(path+"\\*.jpeg")查找.jpeg后缀的图片,但移动时拼接的是.jpg扩展名,导致找不到对应文件,自然无法完成移动操作。
3. 目标文件夹创建的潜在问题
直接使用os.mkdir("image_with_xml")会在文件夹已存在时抛出异常,应该改用支持创建多级目录且忽略已存在情况的os.makedirs。
4. 路径拼接不规范
手动用+拼接路径容易出现分隔符错误,应该始终使用os.path.join处理路径,保证跨系统兼容性。
修复后的完整代码
import os import glob import shutil def remove_ext(list_of_pathnames): return [os.path.splitext(filename)[0] for filename in list_of_pathnames] # 直接指定目标目录,避免切换工作目录带来的路径混淆 target_dir = "D:\\TomProject\\Images\\" newpath = os.path.join(target_dir, "image_with_xml") # 安全创建目标文件夹,已存在则不报错 os.makedirs(newpath, exist_ok=True) # 用os.path.join拼接路径,查找目标目录下的文件 list_of_jpegs = glob.glob(os.path.join(target_dir, "*.jpeg")) list_of_xmls = glob.glob(os.path.join(target_dir, "*.xml")) jpegs_without_extension = remove_ext(list_of_jpegs) xmls_without_extension = remove_ext(list_of_xmls) for filename in jpegs_without_extension: if filename in xmls_without_extension: # 保持扩展名一致,使用.jpeg shutil.move(filename + '.jpeg', newpath) shutil.move(filename + '.xml', newpath)
额外说明:如果你的图片实际是.jpg后缀,只需把glob里的*.jpeg改成*.jpg即可。
内容的提问来源于stack exchange,提问作者tom meskin
相关产品推荐
相关产品推荐

