'Python zipfile, How to set the compression level?

Python supports zipping files when zlib is available, ZIP_DEFLATE

see: https://docs.python.org/3.4/library/zipfile.html

The zip command-line program on Linux supports -1 fastest, -9 best.

Is there a way to set the compression level of a zip file created in Python's zipfile module?



Solution 1:[1]

The zipfile module does not provide this. During compression it uses constant from zlib - Z_DEFAULT_COMPRESSION. By default it equals -1. So you can try to change this constant manually, as possible solution.

Solution 2:[2]

Python 3.7+ answer: If you look at the zipfile.ZipFile constructor you'll see this:

def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=True,
             compresslevel=None):
    """Open the ZIP file with mode read 'r', write 'w', exclusive create 'x',
    or append 'a'.
    ...

compresslevel: None (default for the given compression type) or an integer
               specifying the level to pass to the compressor.
               When using ZIP_STORED or ZIP_LZMA this keyword has no effect.
               When using ZIP_DEFLATED integers 0 through 9 are accepted.
               When using ZIP_BZIP2 integers 1 through 9 are accepted.
    """

which means you can pass the desired compression in the constructor:

myzip = zipfile.ZipFile(file_handle, "w", compression=zipfile.ZIP_DEFLATED, compresslevel=9)

See also https://docs.python.org/3/library/zipfile.html

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Alex Lisovoy
Solution 2