Reputation: 345
I'm using this basic script in Python 2.6 to zip a directory :
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'
The problem is inside my new zip file.
For example, my target folder to zip is on c:/test/directory/myfiles
So when I zip it, instead of getting : file.zip/directory/myfiles,
I have : file.zip/test/directory/myfiles
I don't want to keep the "test" folder.
Someone could tell me how to fix it ?
Upvotes: 5
Views: 729
Reputation: 4505
Python 2.7 and later:
import shutil
zip_path = 'c:/Desktop/zip_name' # Note: no '.zip' in the suffix!
root_folder = 'c:/Documents/directory/'
shutil.make_archive(zip_path, 'zip', root_folder)
Python 2.6:
import os
import zipfile
def my_make_archive(zip_path, root_folder):
zf = zipfile.ZipFile(zip_path, 'w')
for (folder, sub_folder, filenames) in os.walk(root_folder):
for filename in filenames:
abs_file_path = os.path.join(folder, filename)
rel_file_path = os.path.join(os.path.relpath(folder, root_folder), filename)
zf.write(abs_file_path, arcname=rel_file_path)
zf.close()
zip_path = 'c:/Desktop/zip_name.zip' # Note: has '.zip' in the suffix!
root_folder = 'c:/Documents/directory/'
my_make_archive(zip_path, root_folder)
Upvotes: 0
Reputation: 136
In python 2.7 or later :
Try to use "shutil" package
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)
The result :
new_zip_file.zip
└── directory
├── myfile1
├── myfile2
└── myfile3 ...
EDITED
In 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)
It uses argument arcname
and specify in-zip-path.
For example, ziph.write("c:/test/directory/myfile1" , arcname = "dirctory/myfile1")
makes a zipfile such as ziptest.zip/dirctory/myfile1
Upvotes: 2