Search code examples
pythonzipshutil

How do I create a zip file of a file path using Python, including empty directories?


I've been trying to use the zipfile and shutil.make_archive modules to recursively create a zip file of a directory. Both modules work great--except empty directories do not get added to the archive. Empty directories containing other empty directories are also silently skipped.

I can use 7Zip to create an archive of the same path and empty directories are preserved. Therefore I know this is possible within the file format itself. I just don't know how to do it within Python. Any ideas? Thanks!


Solution

  • There is a example using zipfile:

    import os, zipfile  
    from os.path import join  
    def zipfolder(foldername, filename, includeEmptyDIr=True):   
        empty_dirs = []  
        zip = zipfile.ZipFile(filename, 'w', zipfile.ZIP_DEFLATED)  
        for root, dirs, files in os.walk(foldername):  
            empty_dirs.extend([dir for dir in dirs if os.listdir(join(root, dir)) == []])  
            for name in files:  
                zip.write(join(root ,name))  
            if includeEmptyDIr:  
                for dir in empty_dirs:  
                    zif = zipfile.ZipInfo(join(root, dir) + "/")  
                    zip.writestr(zif, "")  
            empty_dirs = []  
        zip.close() 
    
    if __name__ == "__main__":
        zipfolder('test1/noname/', 'zip.zip')