Sometimes you want to unpack the contents of an archive. Sometimes the files in that particular archive are contained in a subfolder, so they won't spam the folder you're extracting it to. This has become good practice in a lot of archives.
But what if you need the files inside the archive, without the enclosing folder(s), i.e. for redistribution or building something else?
Python's ZipFile allows you to specify a destination, but each member of the archive will still be extracted with it's full path relative to that folder. So here is a little hack:
def d_zip(filename, dest=".", strip_levels=1):
# create the zipfile object
zfile = ZipFile(filename)
tmpdir = tempfile.gettempdir()
for zip_path in zfile.namelist():
# truncate the path, dropping dirs from the start on the /-split string
truncated_path = os.path.sep.join(zip_path.split(os.path.sep)[strip_levels:])
# now, join to the dest so we got a new destination path
dest_path = os.path.join(dest, truncated_path)
# extract the file, store resulting path
extracted_path = zfile.extract(zip_path, tmpdir)
# Paths must exist when moving. Let's make sure that is the case.
dest_dir = os.path.dirname(dest_path)
if not os.path.isdir(dest_dir):
os.makedirs(dest_dir)
# Moving the files only. We got the directories covered.
if not os.path.isdir(extracted_path):
os.rename(extracted_path, dest_path)