简体   繁体   中英

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

I am working on a program to organise all files in my downloads folder. For that I am trying to move every file in every subdirectory in my downloads folder to a new folder called "all files". What I don't understand is, that I can access the files in the subfolders (and print them for instance), but I cannot move them. I get the following error instead:

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

Here is the code:

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

Thank you very much for your tips, help and suggestions of any kind!

I think this is caused by a simple typo. You are trying to perform ashutil.move on subfolder_path - a list of all files/dirs under the entry path instead of subfolder_file - the files/dirs within the list you are iterating over within the for loop.

Additionally however, you probably want to be specifying a full path rather than just the base name of the files/dirs you are moving, which is what is returned by os.listdir

Instead you want:

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM