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

Python下载文件夹文件归集报错:TypeError路径类型错误

文件整理程序移动文件报错问题解决建议

我正在开发一个程序整理下载文件夹中的所有文件,需要将下载文件夹下所有子目录中的文件移动到名为“all files”的新文件夹中。目前可以访问子文件夹中的文件(例如打印文件列表),但无法移动它们,出现如下错误:

Traceback (most recent call last):

  File "C:\Users\My Username\Desktop\Desktop\Python\testing\147_file_organizer.py", line 33, in <module>
    shutil.move(subfolder_path, dst_path)

  File "D:\anaconda3\lib\shutil.py", line 801, in move
    if _samefile(src, dst):

  File "D:\anaconda3\lib\shutil.py", line 220, in _samefile
    return os.path.samefile(src, dst)

  File "D:\anaconda3\lib\genericpath.py", line 100, in samefile
    s1 = os.stat(f1)

TypeError: stat: path should be string, bytes, os.PathLike or integer, not list

我的代码如下:

import os
import shutil


path = ('C:/Users/My Username/Downloads/')
obj = os.scandir(path)

for entry in obj:
    dst_path = r'C:/Users/My Username/Downloads/all files/'
    if entry.is_dir():
        subfolder_path = os.listdir(path + entry.name)
        for subfolder_file in subfolder_path:
            shutil.move(subfolder_path, dst_path)

obj.close()

问题分析

  1. 参数类型错误:shutil.move的第一个参数要求是单个文件/目录的路径字符串,但你传入的subfolder_path是os.listdir()返回的文件名列表,这是报错的直接原因。
  2. 路径不完整:os.listdir()只返回子文件夹内的文件名,不是完整路径,系统无法识别这些孤立的文件名。
  3. 未处理目标文件夹不存在的情况:如果all files文件夹还没创建,shutil.move会直接报错。
  4. 未跳过目标文件夹:如果不跳过all files本身,程序会尝试移动它里面的文件,造成不必要的循环。

修正后的代码

import os
import shutil

# 定义根路径和目标路径
root_path = 'C:/Users/My Username/Downloads/'
dst_path = os.path.join(root_path, 'all files')

# 提前创建目标文件夹(不存在则创建,存在则跳过)
os.makedirs(dst_path, exist_ok=True)

# 使用上下文管理器遍历目录,无需手动关闭
with os.scandir(root_path) as entries:
    for entry in entries:
        # 跳过目标文件夹,只处理其他子目录
        if entry.is_dir() and entry.name != 'all files':
            # 获取子文件夹的完整路径
            subfolder_full_path = entry.path
            # 遍历子文件夹内的所有条目
            with os.scandir(subfolder_full_path) as sub_entries:
                for sub_entry in sub_entries:
                    # 仅处理文件(如需移动子目录可删除此判断)
                    if sub_entry.is_file():
                        # 拼接目标文件的完整路径
                        target_file = os.path.join(dst_path, sub_entry.name)
                        # 处理重名文件:自动添加序号避免覆盖
                        counter = 1
                        while os.path.exists(target_file):
                            file_name, file_ext = os.path.splitext(sub_entry.name)
                            target_file = os.path.join(dst_path, f"{file_name}_{counter}{file_ext}")
                            counter += 1
                        # 执行移动操作
                        shutil.move(sub_entry.path, target_file)

额外建议

  • 用os.path.join()拼接路径,避免手动拼接时的斜杠问题,同时兼容Windows、Linux等不同系统。
  • 上下文管理器with os.scandir()会自动释放资源,比手动调用close()更安全可靠。
  • 添加重名文件处理逻辑,防止移动时覆盖已存在的文件。
  • 如果需要递归处理多层子目录,可以改用os.walk(),它会自动遍历所有层级的子目录。

内容的提问来源于stack exchange,提问作者fbn001

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 11:03:15