blob: 53463dd6cdd0804808b149e0959593fa4ca6d4ff [file] [log] [blame]
Guido van Rossum9a4da081999-03-12 19:07:59 +00001#!/usr/bin/env python
Guido van Rossum5416a0d1997-05-28 16:13:21 +00002
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00003# Takes an optional filename, defaulting to this file itself.
4# Reads the file and compresses the content using level 1 and level 9
5# compression, printing a summary of the results.
6
Guido van Rossum5416a0d1997-05-28 16:13:21 +00007import zlib, sys
Guido van Rossum5416a0d1997-05-28 16:13:21 +00008
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00009def main():
10 if len(sys.argv) > 1:
11 filename = sys.argv[1]
12 else:
13 filename = sys.argv[0]
Collin Winter6f2df4d2007-07-17 20:59:35 +000014 print('Reading', filename)
Guido van Rossum5416a0d1997-05-28 16:13:21 +000015
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000016 f = open(filename, 'rb') # Get the data to compress
17 s = f.read()
18 f.close()
Guido van Rossum5416a0d1997-05-28 16:13:21 +000019
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000020 # First, we'll compress the string in one step
21 comptext = zlib.compress(s, 1)
22 decomp = zlib.decompress(comptext)
Guido van Rossum5416a0d1997-05-28 16:13:21 +000023
Collin Winter6f2df4d2007-07-17 20:59:35 +000024 print('1-step compression: (level 1)')
25 print(' Original:', len(s), 'Compressed:', len(comptext), end=' ')
26 print('Uncompressed:', len(decomp))
Guido van Rossum5416a0d1997-05-28 16:13:21 +000027
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000028 # Now, let's compress the string in stages; set chunk to work in smaller steps
Guido van Rossum5416a0d1997-05-28 16:13:21 +000029
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000030 chunk = 256
31 compressor = zlib.compressobj(9)
32 decompressor = zlib.decompressobj()
33 comptext = decomp = ''
34 for i in range(0, len(s), chunk):
35 comptext = comptext+compressor.compress(s[i:i+chunk])
36 # Don't forget to call flush()!!
37 comptext = comptext + compressor.flush()
38
39 for i in range(0, len(comptext), chunk):
40 decomp = decomp + decompressor.decompress(comptext[i:i+chunk])
41 decomp=decomp+decompressor.flush()
42
Collin Winter6f2df4d2007-07-17 20:59:35 +000043 print('Progressive compression (level 9):')
44 print(' Original:', len(s), 'Compressed:', len(comptext), end=' ')
45 print('Uncompressed:', len(decomp))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +000046
47if __name__ == '__main__':
48 main()