Search code examples
pythonwindowspython-zipfile

Not yielding files inside nested folders using python zipfile


(Python 3.8, zipfile module, Windows 10 Anaconda)

I was using the zipfile module of python to create Zip Files of my folders.

My Folder was D:/Personals. An os.listdir of personals yields 2 folders and 171 files. When I checked the zip it contained all the 171 files of the folder and the 2 inner nested folders. But the inner nested folders were empty, though each contained many individual files. Here is my code.

from zipfile import ZipFile 
from os import listdir 

dir_path = 'D:/Personals'
export_path = 'D:/Zipper'

items_list = listdir(dir_path)
zipper = ZipFile(export_path+'/S1.zip','w')

for item in items_list:
    zipper.write(dir_path+'/'+item)

zipper.close()

It has yielded all the files inside the folder but failed to return the files inside the 2 nested folders. Kindly advise what can I do?


Solution

  • When zipping folders using the ZipFile module, you must use recursion to include the subfolders.

    Try this code:

    from zipfile import ZipFile 
    from os import listdir, path
    
    dir_path = 'D:/Personals'  # root folder to zip
    export_path = 'D:/Zipper'  # target folder for zip file
    
    items_list = listdir(dir_path)
    zipper = ZipFile(export_path+'/S1.zip','w')
    
    def addzipitems(zipper, folder):  # single folder
        for item in listdir(folder):  # each item (file or folder)
            zipper.write(folder+'/'+item)  # add item to zip (for folder, will add empty)
            if path.isdir(folder +'/'+item):  # if item is subfolder
                addzipitems(zipper, folder +'/'+item)   # process subfolder
    
    addzipitems(zipper, dir_path)  # start at root folder
    zipper.close()
    

    You can also use os.walk to get all the files in a directory tree. No recursion needed.

    from zipfile import ZipFile 
    from os import listdir, path, walk
    
    dir_path = 'D:/Personals'  # root folder to zip
    export_path = 'D:/Zipper'  # target folder for zip file
    
    zipper = ZipFile(export_path+'/S1.zip','w')
    
    for path, directories, files in walk(dir_path): # all folders\files in tree
        for f in files:  # files is list
            zipper.write(path+'/'+f)
    
    zipper.close()