Как извлечь файл из zip по адресу без копирования директорий из zip
Предположим, у меня есть zip файл imgs.zip, следующего вида:
/cats/1.png
/cats/2.png
/dogs/1.png
/dogs/2.png
...
Я попробовал извлечь так:
with zipfile.ZipFile(TexturePath) as myzip:
ZipList = myzip.namelist()
num = 0
for file in ZipList:
filename, file_extension = os.path.splitext(file)
if file_extension in ['.png']: # извлекаем только .png
myzip.extract(file, os.path.join(temp, str(num)+file_extension))
num += 1
myzip.close()
НО! При таком коде myzip.extract копирует не только сам файл, но и директории
Т.е. путь, где искать извлеченный файл будет: /путь_извлечения/cats_или_dogs/изображение
А нужно /путь_извлечения/изображение
Как я могу это сделать?
Ответы (1 шт):
Автор решения: nomnoms12
→ Ссылка
Если использовать infolist(), вместо namelist(), то появляется возможность изменять атрибут filename у файла в архиве.
Пример:
import os
from zipfile import ZipFile
with ZipFile('imgs.zip') as archive:
num = 0
for member in archive.infolist():
name, extension = os.path.splitext(member.filename)
if extension in ['.png']:
member.filename = f'{num}{extension}'
archive.extract(member, './путь_извлечения/')
num += 1
При необходимости повторно обращаться к элементам архива, можно делать так:
backup = member.filename
member.filename = f'{num}{extension}'
archive.extract(member, './путь_извлечения/')
member.filename = backup