Zip директория цель - PullRequest
       21

Zip директория цель

0 голосов
/ 02 июля 2018

Я использую этот базовый скрипт в Python 2.6, чтобы заархивировать каталог:

def zipdir(path, ziph):
    import os, zipfile
    for(dir, _, files) in os.walk(path):
        for file in files:
            ziph.write(os.path.join(dir, file))

ziph = zipfile.ZipFile(name + '.zip', 'w', zipfile.ZIP_DEFLATED)
path = 'c:/test/directory'

Проблема в моем новом zip-файле.

Например, моя целевая папка для zip включена c:/test/directory/myfiles

Так что, когда я застегиваю его, вместо того, чтобы получить: file.zip/directory/myfiles,

У меня есть: file.zip/test/directory/myfiles

Я не хочу хранить папку «test».

Кто-то может сказать мне, как это исправить?

1 Ответ

0 голосов
/ 02 июля 2018

В Python 2.7 или более поздней версии:

Попробуйте использовать пакет "шутил"

import shutil
import os

zip_path = 'c:/test/new_zip_file'
target_dir_path = 'c:/test/directory'

# such as "c:/test/"
parent_target_dir_path = os.path.dirname(target_dir_path)
# such as "directory"
target_dir_name = os.path.basename(target_dir_path)

shutil.make_archive(zip_path, 'zip', root_dir=parent_target_dir_path, base_dir=target_dir_name)

Результат:

new_zip_file.zip
└── directory
    ├── myfile1
    ├── myfile2
    └── myfile3 ...

EDITED

В Python 2.6:

import zipfile

def zipdir(path, ziph):
    import os, zipfile
    parent_dir_name = os.path.basename(path)
    for(dir, _, files) in os.walk(path):
        for file in files:
            path_in_zip = dir[dir.find(parent_dir_name):]
            ziph.write(os.path.join(dir, file) , arcname = path_in_zip+"/"+file)

name = "ziptest"

ziph = zipfile.ZipFile(name + '.zip', 'w', zipfile.ZIP_DEFLATED)
path = 'c:/test/directory'

zipdir(path, ziph)

Используется аргумент arcname и указывается in-zip-путь.
Например, ziph.write("c:/test/directory/myfile1" , arcname = "dirctory/myfile1") создает ZIP-файл, такой как ziptest.zip/dirctory/myfile1

...