How to create a zip archive of a directory in Python?

后端 未结 25 2619
暗喜
暗喜 2020-11-22 07:12

How can I create a zip archive of a directory structure in Python?

相关标签:
25条回答
  • 2020-11-22 08:00

    The easiest way is to use shutil.make_archive. It supports both zip and tar formats.

    import shutil
    shutil.make_archive(output_filename, 'zip', dir_name)
    

    If you need to do something more complicated than zipping the whole directory (such as skipping certain files), then you'll need to dig into the zipfile module as others have suggested.

    0 讨论(0)
  • 2020-11-22 08:03

    Use shutil, which is part of python standard library set. Using shutil is so simple(see code below):

    • 1st arg: Filename of resultant zip/tar file,
    • 2nd arg: zip/tar,
    • 3rd arg: dir_name

    Code:

    import shutil
    shutil.make_archive('/home/user/Desktop/Filename','zip','/home/username/Desktop/Directory')
    
    0 讨论(0)
  • 2020-11-22 08:03

    I've made some changes to code given by Mark Byers. Below function will also adds empty directories if you have them. Examples should make it more clear what is the path added to the zip.

    #!/usr/bin/env python
    import os
    import zipfile
    
    def addDirToZip(zipHandle, path, basePath=""):
        """
        Adding directory given by \a path to opened zip file \a zipHandle
    
        @param basePath path that will be removed from \a path when adding to archive
    
        Examples:
            # add whole "dir" to "test.zip" (when you open "test.zip" you will see only "dir")
            zipHandle = zipfile.ZipFile('test.zip', 'w')
            addDirToZip(zipHandle, 'dir')
            zipHandle.close()
    
            # add contents of "dir" to "test.zip" (when you open "test.zip" you will see only it's contents)
            zipHandle = zipfile.ZipFile('test.zip', 'w')
            addDirToZip(zipHandle, 'dir', 'dir')
            zipHandle.close()
    
            # add contents of "dir/subdir" to "test.zip" (when you open "test.zip" you will see only contents of "subdir")
            zipHandle = zipfile.ZipFile('test.zip', 'w')
            addDirToZip(zipHandle, 'dir/subdir', 'dir/subdir')
            zipHandle.close()
    
            # add whole "dir/subdir" to "test.zip" (when you open "test.zip" you will see only "subdir")
            zipHandle = zipfile.ZipFile('test.zip', 'w')
            addDirToZip(zipHandle, 'dir/subdir', 'dir')
            zipHandle.close()
    
            # add whole "dir/subdir" with full path to "test.zip" (when you open "test.zip" you will see only "dir" and inside it only "subdir")
            zipHandle = zipfile.ZipFile('test.zip', 'w')
            addDirToZip(zipHandle, 'dir/subdir')
            zipHandle.close()
    
            # add whole "dir" and "otherDir" (with full path) to "test.zip" (when you open "test.zip" you will see only "dir" and "otherDir")
            zipHandle = zipfile.ZipFile('test.zip', 'w')
            addDirToZip(zipHandle, 'dir')
            addDirToZip(zipHandle, 'otherDir')
            zipHandle.close()
        """
        basePath = basePath.rstrip("\\/") + ""
        basePath = basePath.rstrip("\\/")
        for root, dirs, files in os.walk(path):
            # add dir itself (needed for empty dirs
            zipHandle.write(os.path.join(root, "."))
            # add files
            for file in files:
                filePath = os.path.join(root, file)
                inZipPath = filePath.replace(basePath, "", 1).lstrip("\\/")
                #print filePath + " , " + inZipPath
                zipHandle.write(filePath, inZipPath)
    

    Above is a simple function that should work for simple cases. You can find more elegant class in my Gist: https://gist.github.com/Eccenux/17526123107ca0ac28e6

    0 讨论(0)
  • 2020-11-22 08:03

    Say you want to Zip all the folders(sub directories) in the current directory.

    for root, dirs, files in os.walk("."):
        for sub_dir in dirs:
            zip_you_want = sub_dir+".zip"
            zip_process = zipfile.ZipFile(zip_you_want, "w", zipfile.ZIP_DEFLATED)
            zip_process.write(file_you_want_to_include)
            zip_process.close()
    
            print("Successfully zipped directory: {sub_dir}".format(sub_dir=sub_dir))
    
    0 讨论(0)
  • 2020-11-22 08:03

    Zip a file or a tree (a directory and its sub-directories).

    from pathlib import Path
    from zipfile import ZipFile, ZIP_DEFLATED
    
    def make_zip(tree_path, zip_path, mode='w', skip_empty_dir=False):
        with ZipFile(zip_path, mode=mode, compression=ZIP_DEFLATED) as zf:
            paths = [Path(tree_path)]
            while paths:
                p = paths.pop()
                if p.is_dir():
                    paths.extend(p.iterdir())
                    if skip_empty_dir:
                        continue
                zf.write(p)
    

    To append to an existing archive, pass mode='a', to create a fresh archive mode='w' (the default in the above). So let's say you want to bundle 3 different directory trees under the same archive.

    make_zip(path_to_tree1, path_to_arch, mode='w')
    make_zip(path_to_tree2, path_to_arch, mode='a')
    make_zip(path_to_file3, path_to_arch, mode='a')
    
    0 讨论(0)
  • 2020-11-22 08:04

    Try the below one .it worked for me.

    import zipfile, os
    zipf = "compress.zip"  
    def main():
        directory = r"Filepath"
        toZip(directory)
    def toZip(directory):
        zippedHelp = zipfile.ZipFile(zipf, "w", compression=zipfile.ZIP_DEFLATED )
    
        list = os.listdir(directory)
        for file_list in list:
            file_name = os.path.join(directory,file_list)
    
            if os.path.isfile(file_name):
                print file_name
                zippedHelp.write(file_name)
            else:
                addFolderToZip(zippedHelp,file_list,directory)
                print "---------------Directory Found-----------------------"
        zippedHelp.close()
    
    def addFolderToZip(zippedHelp,folder,directory):
        path=os.path.join(directory,folder)
        print path
        file_list=os.listdir(path)
        for file_name in file_list:
            file_path=os.path.join(path,file_name)
            if os.path.isfile(file_path):
                zippedHelp.write(file_path)
            elif os.path.isdir(file_name):
                print "------------------sub directory found--------------------"
                addFolderToZip(zippedHelp,file_name,path)
    
    
    if __name__=="__main__":
        main()
    
    0 讨论(0)
提交回复
热议问题