Как извлечь файлы с одинаковыми названиями, но из разных архивов, переименовывая
Есть 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)