#!/usr/bin/env python3 # Takes an optional filename, defaulting to this file itself. # Reads the file and compresses the content using level 1 and level 9 # compression, printing a summary of the results. import zlib, sys def main(): if len(sys.argv) > 1: filename = sys.argv[1] else: filename = sys.argv[0] print('Reading', filename) with open(filename, 'rb') as f: # Get the data to compress s = f.read() # First, we'll compress the string in one step comptext = zlib.compress(s, 1) decomp = zlib.decompress(comptext) print('1-step compression: (level 1)') print(' Original:', len(s), 'Compressed:', len(comptext), end=' ') print('Uncompressed:', len(decomp)) # Now, let's compress the string in stages; set chunk to work in smaller steps chunk = 256 compressor = zlib.compressobj(9) decompressor = zlib.decompressobj() comptext = decomp = b'' for i in range(0, len(s), chunk): comptext += compressor.compress(s[i:i+chunk]) # Don't forget to call flush()!! comptext += compressor.flush() for i in range(0, len(comptext), chunk): decomp += decompressor.decompress(comptext[i:i+chunk]) decomp += decompressor.flush() print('Progressive compression (level 9):') print(' Original:', len(s), 'Compressed:', len(comptext), end=' ') print('Uncompressed:', len(decomp)) if __name__ == '__main__': main()