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

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'

问题分析与修复

核心问题

  1. 循环中修改了原始源目录变量:第一次循环时,source_folder被改成了某个jpg文件的路径,第二次循环执行os.path.join(source_folder, filename)时,会把新文件名拼到这个文件路径后面,生成/Downloads/image000000.jpg/bagels12.jpg这种不存在的路径,触发报错。
  2. 移动操作放在循环外部: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 16:05:05