Search code examples
pythonzipdata-extraction

How can I extract multiple .zip files?


I'm trying to extract multiple files from some .zip archives. My code is:

import os
import zipfile

os.chdir('/home/marlon/Shift One/Projeto Philips/Consolidação de Arquivos')

for f in os.listdir("/home/marlon/Shift One/Projeto Philips/Consolidação de Arquivos"):
    if f.endswith(".zip"):
        z = zipfile.ZipFile(f, 'r')
        z.extractall(path = '/home/marlon/Shift One/Projeto Philips/Consolidação de Arquivos/dados')
        z.close()

However, it only extracts the files inside the first archive. I'm using Python 3.6. What is wrong?


Solution

  • I thought this scenario might be a serious candidate ...

    What happens is that for each .zip file, all its members are extracted, but they overwrite the ones extracted from the previous file (well, except the 1st). So, at the end, you end up with the files from the last archive that was enumerated.
    To get past this issue, you should unzip each .zip file members in a separate directory (the .zip file name).

    Below is an example (I also simplified / cleaned your code a bit).

    code00.py:

    #!/usr/bin/env python3
    
    import os
    import glob
    import zipfile
    
    
    dir_name_base = r"/home/marlon/Shift One/Projeto Philips/Consolidação de Arquivos"
    
    for arc_name in glob.iglob(os.path.join(dir_name_base, "*.zip")):
        arc_dir_name = os.path.splitext(os.path.basename(arc_name))[0]
        zf = zipfile.ZipFile(arc_name)
        zf.extractall(path=os.path.join(dir_name_base, "dados", arc_dir_name))
        zf.close()  # Close file after extraction is completed