Python文件分类脚本遇多同类型文件报错,求修复方案
问题:Python文件分类脚本处理多同类型文件时报错
我是Python新手,正在编写自定义文件分类脚本作为入门项目。当前遇到的问题是:当目录中存在多个同类型文件时,脚本会抛出大量错误。以下是我的代码:
import shutil import os home = '/home/mis1nput' source_folder = home + '/Downloads/' destination_folder = '' for filename in os.listdir(source_folder): if filename.endswith('.jpg'): destination_folder = (home + '/Pictures') source_folder = os.path.join(source_folder, filename) destination_folder = os.path.join(destination_folder, filename) shutil.move(source_folder,destination_folder)
报错信息如下:
Traceback (most recent call last): File "/usr/lib/python3.14/shutil.py", line 918, in move os.rename(src, real_dst) ~~~~~~~~~^^^^^^^^^^^^^^^ NotADirectoryError: [Errno 20] Not a directory: '/home/mis1nput/Downloads/image000000.jpg/bagels12.jpg' -> '/home/mis1nput/Pictures/bagels12.jpg' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/mis1nput/Python-Projects/file-mover.py", line 25, in <module> shutil.move(source_folder,destination_folder) ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.14/shutil.py", line 938, in move copy_function(src, real_dst) ~~~~~~~~~~~~~^^^^^^^^^^^^^^^ File "/usr/lib/python3.14/shutil.py", line 529, in copy2 copyfile(src, dst, follow_symlinks=follow_symlinks) ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3.14/shutil.py", line 313, in copyfile with open(src, 'rb') as fsrc: ~~~~^^^^^^^^^^^ NotADirectoryError: [Errno 20] Not a directory: '/home/mis1nput/Downloads/image000000.jpg/bagels12.jpg'
问题分析与修复
核心问题
- 循环中修改了原始源目录变量:第一次循环时,
source_folder被改成了某个jpg文件的路径,第二次循环执行os.path.join(source_folder, filename)时,会把新文件名拼到这个文件路径后面,生成/Downloads/image000000.jpg/bagels12.jpg这种不存在的路径,触发报错。 - 移动操作放在循环外部:
shutil.move只执行一次,无法处理多个文件。
修复后的代码
import shutil import os home = '/home/mis1nput' source_dir = home + '/Downloads/' destination_dir = home + '/Pictures' # 确保目标目录存在,避免移动时因目录缺失报错 os.makedirs(destination_dir, exist_ok=True) for filename in os.listdir(source_dir): # 只处理文件,跳过子目录 file_path = os.path.join(source_dir, filename) if os.path.isfile(file_path) and filename.endswith('.jpg'): dest_path = os.path.join(destination_dir, filename) shutil.move(file_path, dest_path)
关键改进点
- 重命名原始源目录变量为
source_dir,避免和循环内的单个文件路径混淆,循环中不再修改根目录变量。 - 将
shutil.move移入循环内部,每找到一个符合条件的文件就执行移动操作。 - 添加
os.makedirs(destination_dir, exist_ok=True),确保目标目录存在,无需手动创建。 - 增加
os.path.isfile判断,跳过Downloads中的子目录,避免误处理目录。
内容的提问来源于stack exchange,提问作者XxMis1nputxX
相关产品推荐
相关产品推荐

