Подскажите как убрать ошибку

Рейтинг: -1Ответов: 1Опубликовано: 14.01.2023
Traceback (most recent call last):
  File "C:\Projects\Test_Project\Test.py", line 81, in <module>
    shutil.move(file, path_folder_for_sort + '/' + name_group)
  File "C:\Users\Lenovo\AppData\Local\Programs\Python\Python311\Lib\shutil.py", line 822, in move
    raise Error("Destination path '%s' already exists" % real_dst)
shutil.Error: Destination path '/Projects/Example/documents\activate_this.py' already exists

Вылетает такая ошибка в cmd. Я написал скрипт который сортирует по папкам файлы из словаря, скрипт запускается из cmd(python script_name /path/to/folder). Скорее всего ошибка в том что есть функция которая создаёт папки и если я 2 раза сортирую одну и ту же папку, то ошибка вылезает потому что эти папки из ключей словаря с форматами файлов уже существуют. Как я могу это исправить чтобы я мог сортировать одну папку несколько раз без ошибки? И может будут какие-то рекомендации по моему коду, я очень сомневаюсь что сделал его по стандартам)))

import os
import shutil

from pathlib import Path
from os.path import split
from sys import argv


def create_folders_from_groups(path_to_folder, folder_names):
    for folder_for_sorted in folder_names.keys():
        os.makedirs(path_to_folder + '/' + folder_for_sorted, exist_ok=True)


def parse_files(folder_path):
    path = Path(folder_path)

    file_names = []
    file_paths = []

    for item in path.rglob("*"):
        if item.is_file():
            file_names.append(item.name)
            file_paths.append(Path(item))
    return file_names, file_paths


def parse_folders(folder_path):
    path = Path(folder_path)

    folder_names = []
    folder_paths = []

    for item in path.rglob("*"):
        if not item.is_file():
            folder_names.append(item.name)
            folder_paths.append(Path(item))
    return folder_names, folder_paths


def sort_files(files_paths, groups_of_files):
    pass


if __name__ == '__main__':

    path_folder_for_sort = argv[-1]
    groups_of_format = {
        'images': ['JPEG', 'PNG', 'JPG', 'SVG', 'EXE'],
        'video': ['AVI', 'MP4', 'MOV', 'MKV'],
        'documents': ['DOC', 'DOCX', 'TXT', 'PDF', 'XLSX', 'PPTX', 'PY'],
        'audio': ['MP3', 'OGG', 'WAV', 'AMR', 'XML'],
        'archive': ['ZIP', 'GZ', 'TAR'],
    }
    groups_of_files = {
        'images': [],
        'video': [],
        'documents': [],
        'audio': [],
        'archive': [],
    }
    set_of_formats = set()
    set_of_unknown_formats = set()

    files_names, files_paths = parse_files(path_folder_for_sort)
    folders_names, folders_paths = parse_folders(path_folder_for_sort)
    create_folders_from_groups(path_folder_for_sort, groups_of_format)
    for file in files_names:
        for name_group, formats in groups_of_format.items():
            if file.split('.')[-1].upper() in formats:
                groups_of_files[name_group].append(file)
                set_of_formats.add(file.split('.')[-1])
            elif file.split('.')[-1].upper() not in formats:
                set_of_unknown_formats.add(file.split('.')[-1])
                set_of_unknown_formats = set_of_unknown_formats.difference(set_of_formats)
    print(groups_of_files)
    print('Known formats of files: ', set_of_formats)
    print('Unknown formats of files: ', set_of_unknown_formats)
    for file in files_paths:
        for name_group, formats in groups_of_files.items():
            if split(file)[-1] in formats:
                shutil.move(file, path_folder_for_sort + '/' + name_group)

Ответы

▲ 1Принят

Эта ошибка возникает при повторной обработке каталога, поскольку ранее файлы уже были перенесены в соответствующие подкаталоги. path.rglob("*") рекурсивно сканирует каталог с подкаталогами и находит уже перенесенные файлы. Далее shutil.move() пытается перенести найденные файлы сами в себя, что и вызывает ошибку. Есть несколько способов избежать ошибки, некоторые из них:

  • использовать другой подход к сканированию каталога, без обработки подкаталогов;
  • не размещать подкаталоги-приёмники для сортировки в том же каталоге, где находятся обрабатываемые файлы;
  • проверять перед переносом файлов, не собираемся ли мы переносить их сами в себя:
if Path(file) != Path(path_folder_for_sort + '/' + name_group + '/' + split(file)[-1]):
    shutil.move(file, path_folder_for_sort + '/' + name_group)
  • обработать ошибку:
try:
    shutil.move(file, path_folder_for_sort + '/' + name_group)
except Exception as e: # или except shutil.Error as e:
    print('Не могу переместить файл сам в себя',e)