尝试将文件从许多不同的子文件夹移动到主子文件夹

trying to move files from many different subfolders to a main subfolder

提问人:fbn001 提问时间:8/22/2022 最后编辑:fbn001 更新时间:8/22/2022 访问量:91

问:

我正在开发一个程序来组织下载文件夹中的所有文件。为此,我尝试将下载文件夹中每个子目录中的每个文件移动到名为“所有文件”的新文件夹中。我不明白的是,我可以访问子文件夹中的文件(例如打印它们),但我无法移动它们。相反,我收到以下错误:

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()

非常感谢您的提示、帮助和建议!

python 子目录 shutil scandir

评论

2赞 Adam Smith 8/22/2022
如果包含整个堆栈跟踪,则非常有用。这应该指向抛出错误的行。我希望它打开了?entry.is_dir()
0赞 fbn001 8/22/2022
对不起,我添加了整个堆栈。

答:

1赞 lemonhead 8/22/2022 #1

我认为这是由一个简单的错别字引起的。您正在尝试执行 shutil.move on - 条目路径下所有文件/目录的列表,而不是 - 您在 for 循环中迭代的列表中的文件/目录。subfolder_pathsubfolder_file

但是,此外,您可能希望指定一个完整路径,而不仅仅是要移动的文件/目录的基本名称,这是 os.listdir 返回的内容

相反,您需要:

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(os.path.join(entry.path, subfolder_file), dst_path)

评论

0赞 fbn001 8/23/2022
谢谢。有些东西奏效了!我仍然需要围绕解决方案进行思考,因为发生了一些事情,程序将文件从许多文件夹(但不是所有文件夹)移动到其目的地。