В 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