Программа сортировки файлов создает вложенные каталоги при повторном запуске

Когда код запускается в первый раз, все работает отлично, но когда я выполняю его во второй раз, уже существующие каталоги вложены, и код останавливается после ошибки, из-за которой он не может поместить папку в папку с тем же именем.

      import os
import shutil

path = "your_path"



file_names = os.listdir(path)

folder_names=["image files","text files","archives","setups","word files","pdf files","other documents","miscellaneous"]

for i in range(len(folder_names)):
    if not os.path.exists(path+folder_names[i]):
        os.mkdir(path+folder_names[i])
    else:
        break

for file in file_names:
    if ".txt" in file and not os.path.exists(path + "text files/" + file):
        shutil.move(path + file, path + "text files/" + file)
    elif ".pdf" in file and not os.path.exists(path + "pdf files/" + file):
        shutil.move(path + file, path + "pdf files/" + file)
    elif ".exe" in file and not os.path.exists(path + "setups/" + file):
        shutil.move(path + file, path + "setups/" + file)
    elif any(ext in file for ext in [".zip", ".rar"]) and not os.path.exists(path + "archives/" + file):
        shutil.move(path + file, path + "archives/" + file)
    elif any(ext in file for ext in [".docx", ".doc"]) and not os.path.exists(path + "word files/" + file):
        shutil.move(path + file, path + "word files/" + file)
    elif any(ext in file for ext in [".jpg",".gif", ".jpeg", ".png"]) and not os.path.exists(path + "image files/" + file):
        shutil.move(path + file, path + "image files/" + file)
    elif any(ext in file for ext in [".pptx", ".xlsx", ".csv"]) and not os.path.exists(path + "image files/" + file):
        shutil.move(path + file, path + "other documents/" + file)
    else:
        shutil.move(path + file, path + "miscellaneous/" + file)

Следующий код после выполнения второго раза останавливается после следующего кода ошибки

      Traceback (most recent call last):
  File "C:\Users\Dell\AppData\Local\Programs\Python\Python37\lib\shutil.py", line 563, in move
    os.rename(src, real_dst)
OSError: [WinError 87] The parameter is incorrect: 'C:/Users/Dell/Downloads/miscellaneous' -> 'C:/Users/Dell/Downloads/miscellaneous/miscellaneous'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Dell\PycharmProjects\file_sorter\main.py", line 32, in <module>
    shutil.move(path + file, path + "miscellaneous/" + file)
  File "C:\Users\Dell\AppData\Local\Programs\Python\Python37\lib\shutil.py", line 572, in move
    " '%s'." % (src, dst))
shutil.Error: Cannot move a directory 'C:/Users/Dell/Downloads/miscellaneous' into itself 'C:/Users/Dell/Downloads/miscellaneous/miscellaneous'.

1 ответ

При первом запуске этого сценария папки изfolder_names(вероятно) не существуют, поэтому их нет в . Однако во второй раз они это делают, поэтому с ними обращаются как с любыми другими файлами, а это означает, что часть сценария попытается переместить их вmiscellaneous.

Что вы хотите сделать, так это исключить эти папки из обработки; вы можете сделать это либо в заключительной части скрипта, заменивelse:блокировать с

      elif file not in folder_names:
    shutil.move(path + file, path + "miscellaneous/" + file)

или в начале скрипта, например, определивfile_namesтаким образом:

      folder_names=["image files","text files","archives","setups","word files","pdf files","other documents","miscellaneous"]

file_names = set(os.listdir(path)) - set(folder_names)
Другие вопросы по тегам