Как извлечь файлы с одинаковыми названиями, но из разных архивов, переименовывая

Есть 3 архива: Alex.zip, Toto.zip и Room.zip

В каждом из них одинаковый набор разных по содержанию изображений:

triangle_НОМЕР.png
square_НОМЕР.png
star_НОМЕР.png

Где НОМЕР - цифра от нуля до тысячи.

Проблема в том, что одинаковые по названию изображения из разных архивов различны по содержанию.

Требуется извлечь их в папки triangle, square, star, соответственно названию, и присвоить им вместо имени число, так, чтобы в каждой папке все изображения были от, например для star, star.0.png до star.КОЛИЧЕСТВО_ИЗОБРАЖЕНИЙ_В_ПАПКЕ.png (аналогично для других изображений).


Ответы (2 шт):

Автор решения: MaxU

Как-то так:

import os
from collections import defaultdict
from zipfile import ZipFile
from glob import glob

def unpack(filename, registry, to_dir="."):
    with ZipFile(filename) as zf:
        for file in zf.filelist:
            fn = os.path.join(to_dir, file.filename)
            kind = fn.partition("_")[0]
            zf.extract(file, to_dir)
            _, ext = os.path.splitext(fn)
            os.rename(fn, f"{kind}.{registry[kind]}{ext}")
            registry[kind] += 1

file_registry = defaultdict(int)

for file in glob(r"C:\temp\test\*.zip"):
    unpack(file, file_registry, to_dir=r"C:\temp\test\result")
→ Ссылка
Автор решения: Alrott SlimRG

В итоге сделал так:

# Создание папок
    print('> Create dataset folder <')
    datasetdir =  os.path.join(path, "dataset")
    traindir = os.path.join(datasetdir, "train")
    testdir = os.path.join(datasetdir, "test")
    for cat in cats:
        traincat = os.path.join(traindir, cat)
        testcat = os.path.join(testdir, cat)

        if not os.path.exists(traincat):
            os.makedirs(traincat)

        if not os.path.exists(testcat):
            os.makedirs(testcat)

    # Распаковка zip файлов
    print('> Unpack ZIPs <')
    for zip in zips:
        zipPath = os.path.join(tmpdirname, zip)
        with tempfile.TemporaryDirectory() as dirtypngs:
            zipFile = ZipFile(zipPath, "r")
            zipFile.extractall(dirtypngs)
            zipFile.close()
            pngs = os.listdir(dirtypngs)
            # Копирование в тестовую папку в соответствии с категорией
            for png in pngs:
                for cat in cats:
                    if png.find(cat) != (-1):
                        catpath = os.path.join(testdir, cat)
                        suffix = png[png.rfind(".") :]
                        pngpath = os.path.join(catpath, str(len(os.listdir(catpath))+1))+suffix
                        sourcepath = os.path.join(dirtypngs, png)
                        shutil.copyfile(sourcepath, pngpath)
→ Ссылка