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)