Помогите исправить ошибку shutil

Рейтинг: 0Ответов: 1Опубликовано: 14.01.2023

Делаю функцию для распаковки архива (в папке с архивом создаётся папка в которой все файлы):

def unpack_archives(archive_path):
    archive_path = Path(archive_path + '/archive')
    for archive in archive_path.rglob("*"):
        try:
            shutil.unpack_archive(archive, archive_path)
        except BaseException:
            continue

Вылазит ошибка, если файл уже был распакован, то есть там файл уже создан. Как это убрать? Какую ошибку вписать в try. Если у меня два архива в папке и один уже был распакован, то я не смогу из-за ошибки распаковать второй архив. Ошибка:

Traceback (most recent call last):
  File "C:\Projects\Test_Project\Test.py", line 125, in <module>
    sort_files(files_paths, groups_of_files)
  File "C:\Projects\Test_Project\Test.py", line 45, in sort_files
    shutil.move(file_path, 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\kek.txt' already exists

Ответы

▲ 1Принят

Чтобы разгрузить ветку комментариев, предложу код в ответе. Распаковываем каждый архив в отдельную папку с его названием.

import os

def unpack_archives(archive_path):
    for archive in archive_path.rglob("*"):
        shutil.unpack_archive(archive, os.path.join(archive_path, archive))

Если неправильно отработает, пиши.

Предлагаю не заморачиваться с пропуском ошибки, т.к. если в двух архивах есть папка, допустим, /images, то при варианте с обработкой ошибок данная папка запишется только из одного архива, а вторая будет игнорирована, что, вероятно, не очень бы хотелось.