Получение правильной структуры каталогов с использованием Zipfile с Python

1

У меня есть структура каталогов, которая похожа на /level1/level2/level3/level4/level5 и на уровне5 у меня есть.json файлы, которые я хочу заменить с помощью zipped-up версий, начиная с /level1/level2/level3/level4/level5/{file1.json, file2.json, file3.json} to /level1/level2/level3/level4/level5/{file1.zip, file2.zip, file3.zip}

Однако мой код генерирует zip файлы в папке, где находится скрипт, который является уровнем 3, в результате чего /level1/level2/[level3]{file1.zip, file2.zip, file3.zip}/level4/level5/{file1.json, file2.json, file3.json}

Кроме того, если я разархивирую файл, я получаю всю структуру каталогов, а не только файл. Например, если я unzip file1.zip, я получаю /level1/level2/[level3]{(/level1/level2/level3/level4/level5/file1.json), file2.zip, file3.zip}/level4/level5/{file1.json, file2.json, file3.json}

Я пробовал разные аргументы, но я не уверен, как получить результат, который я хочу. Как я могу это сделать?

Это мой код в настоящее время

        path = os.path.join(
            os.path.dirname(os.path.abspath(__file__)),
            level4, level5)

        for root, dirs, files in os.walk(path, topdown=True):
            print('This is root: ', root)
            for file in files:
                zf = zipfile.ZipFile(
                    '{}.zip'.format(file[:-5]), 'w',
                    zipfile.ZIP_DEFLATED)
                zf.write(os.path.join(root, file))
                zf.close()
Теги:
zipfile
path

1 ответ

1
Лучший ответ

Вы должны создать zip файл с соединенным корневым путем таким образом, чтобы zip файл был создан там, где находится файл JSON, а при записи JSON файла в zip файл вместо метода write используйте метод writestr чтобы вы могли назвать файл с указанием имени пути, которое в этом случае является просто именем файла без имени пути вообще:

for root, dirs, files in os.walk(path, topdown=True):
    print('This is root: ', root)
    for file in files:
        zf = zipfile.ZipFile(os.path.join(root, '{}.zip'.format(file[:-5])), 'w', zipfile.ZIP_DEFLATED)
        zf.writestr(file, open(os.path.join(root, file)).read())
        zf.close()
  • 0
    Отлично спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню