如何扫描目录并按条件移动文件?Python代码遇TypeError报错求助
批量移动指定格式文件的代码修正方案
错误原因分析
os.listdir(source_dir)返回的是文件名列表,直接将整个列表传入pathlib.Path()会触发TypeError,因为Path()仅接受单个字符串或路径对象,不支持列表。- 代码未遍历列表中的每个文件名,直接对整个列表操作,逻辑不成立。
if extension == '.jpg' or '.png'的条件写法错误:or右侧的.png是是非空字符串,会被Python视为True,导致所有条目都会被判定为符合条件,正确逻辑应判断扩展名是否属于目标格式集合。- 未判断当前条目是否为文件,可能误移动子目录。
修正后的代码
import os import shutil import pathlib source_dir = r'C:\Users\zaner\Downloads' target_dir = r'C:\Users\zaner\OneDrive\Pictures' # 遍历源目录下的所有条目 for item_name in os.listdir(source_dir): # 拼接完整的源文件路径 source_path = os.path.join(source_dir, item_name) # 仅处理文件,跳过子目录 if os.path.isfile(source_path): # 获取扩展名并转小写,兼容JPG/PNG等大写格式 extension = pathlib.Path(source_path).suffix.lower() # 判断是否为目标格式 if extension in ('.jpg', '.jpeg', '.png'): # 拼接目标路径 target_path = os.path.join(target_dir, item_name) # 执行移动操作 shutil.move(source_path, target_path)
额外优化说明
- 加入
os.path.isfile()判断,避免误移动子目录。 - 用
.lower()统一扩展名大小写,覆盖大写格式的图片文件。 - 条件判断改用集合成员检查,逻辑更清晰简洁。
- 显式拼接目标路径,避免
shutil.move因路径问题抛出异常。
内容的提问来源于stack exchange,提问作者Zane Ritchie
相关产品推荐
相关产品推荐

