как с помощью zipfile распаковать файлы без внутрнеей структуры?

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

Есть архив со структурой

icons.zip
---icons
----folder1
-----1.png
-----2.png
----folder2
...

есть код который должен создать папку в которую он будет складывать файлы из это архива по годам/месяцам последнего изменения этих файлов

папка скрипта
---2022
----05
-----1.png
----06
-----2.png

сам код

    def createrDir(name):
        if os.path.exists(name):
            return True
        else:
            try:
                os.makedirs(name)
                return True
            except OSError as e:
                print(f"Возникла ошибка: {e}")
                return False


    def checkDir(date):
        if createrDir(os.path.join(outputDir, date.strftime("%Y")) and
                           createrDir(os.path.join(self.outputDir, date.strftime("%Y"), date.strftime("%m")))):
            return True
        else:
            return False

zip = zipfile.ZipFile(inputDir)
        for file in zip.namelist():
            file_info = zip.getinfo(file)
            date = datetime.datetime(*file_info.date_time)
            file_name = os.path.basename(file_info.filename)
            new_file = os.path.join(outputDir, date.strftime("%Y"), date.strftime("%m"), os.path.basename(file_name))
            if file_info.is_dir():
                continue
            if checkDir(date):
                zip.extract(file_name, new_file)

но почему-то этот код создает такую структуру

---2022
----05
-----1.png #это директория
------icons
-------apps
--------1.png #Это уже файл
----06
-----2.png #это директория
------icons
-------apps
--------2.png #Это уже файл

почему zip.extract() распаковывает данные с явным указанием места со всей структурой? и как это исправить?

Ответы

▲ 1

Короткий ответ:

ZipFile.extract(member, path=None, pwd=None)


Extract a member from the archive to the current working directory; member must be its full name or a ZipInfo object. Its file information is extracted as accurately as possible. path specifies a different directory to extract to. member can be a filename or a ZipInfo object. pwd is the password used for encrypted files as a bytes object.

То есть, в качестве второго параметра вы должны передавать не полный путь к файлу, а только путь к папке в которой он лежит.


Сделайте

new_file = os.path.join(outputDir, date.strftime("%Y"), date.strftime("%m"))

и будет вам счастье


PS: вам не нужно танцев с бубном вокруг создания структуры папок вручную, достаточно сконструировать путь, а папки zipfile и сам создавать умеет