Issue #3488: Provide convenient shorthand functions `gzip.compress`

and `gzip.decompress`.  Original patch by Anand B. Pillai.
This commit is contained in:
Antoine Pitrou 2010-08-17 21:10:05 +00:00
parent 852823d731
commit 79c5ef11d5
5 changed files with 58 additions and 1 deletions

View File

@ -82,6 +82,17 @@ The module defines the following items:
The *filename* argument is required; *mode* defaults to ``'rb'`` and The *filename* argument is required; *mode* defaults to ``'rb'`` and
*compresslevel* defaults to ``9``. *compresslevel* defaults to ``9``.
.. function:: compress(data, compresslevel=9)
Compress the *data*, returning a :class:`bytes` object containing
the compressed data. *compresslevel* has the same meaning as in
the :class:`GzipFile` constructor above.
.. function:: decompress(data)
Decompress the *data*, returning a :class:`bytes` object containing the
uncompressed data.
.. _gzip-usage-examples: .. _gzip-usage-examples:
@ -112,6 +123,11 @@ Example of how to GZIP compress an existing file::
f_out.close() f_out.close()
f_in.close() f_in.close()
Example of how to GZIP compress a binary string::
import gzip
s_in = b"Lots of content here"
s_out = gzip.compress(s_in)
.. seealso:: .. seealso::

View File

@ -10,7 +10,7 @@ import zlib
import builtins import builtins
import io import io
__all__ = ["GzipFile","open"] __all__ = ["GzipFile", "open", "compress", "decompress"]
FTEXT, FHCRC, FEXTRA, FNAME, FCOMMENT = 1, 2, 4, 8, 16 FTEXT, FHCRC, FEXTRA, FNAME, FCOMMENT = 1, 2, 4, 8, 16
@ -476,6 +476,23 @@ class GzipFile(io.BufferedIOBase):
return b''.join(bufs) # Return resulting line return b''.join(bufs) # Return resulting line
def compress(data, compresslevel=9):
"""Compress data in one shot and return the compressed string.
Optional argument is the compression level, in range of 1-9.
"""
buf = io.BytesIO()
with GzipFile(fileobj=buf, mode='wb', compresslevel=compresslevel) as f:
f.write(data)
return buf.getvalue()
def decompress(data):
"""Decompress a gzip compressed string in one shot.
Return the decompressed string.
"""
with GzipFile(fileobj=io.BytesIO(data)) as f:
return f.read()
def _test(): def _test():
# Act like gzip; with -d, act like gunzip. # Act like gzip; with -d, act like gunzip.
# The input file is not deleted, however, nor are any other gzip # The input file is not deleted, however, nor are any other gzip

View File

@ -265,6 +265,26 @@ class TestGzip(unittest.TestCase):
d = f.read() d = f.read()
self.assertEqual(d, data1 * 50, "Incorrect data in file") self.assertEqual(d, data1 * 50, "Incorrect data in file")
# Testing compress/decompress shortcut functions
def test_compress(self):
for data in [data1, data2]:
for args in [(), (1,), (6,), (9,)]:
datac = gzip.compress(data, *args)
self.assertEqual(type(datac), bytes)
with gzip.GzipFile(fileobj=io.BytesIO(datac), mode="rb") as f:
self.assertEqual(f.read(), data)
def test_decompress(self):
for data in (data1, data2):
buf = io.BytesIO()
with gzip.GzipFile(fileobj=buf, mode="wb") as f:
f.write(data)
self.assertEqual(gzip.decompress(buf.getvalue()), data)
# Roundtrip with compress
datac = gzip.compress(data)
self.assertEqual(gzip.decompress(datac), data)
def test_main(verbose=None): def test_main(verbose=None):
support.run_unittest(TestGzip) support.run_unittest(TestGzip)

View File

@ -634,6 +634,7 @@ Neale Pickett
Jim St. Pierre Jim St. Pierre
Dan Pierson Dan Pierson
Martijn Pieters Martijn Pieters
Anand B. Pillai
François Pinard François Pinard
Zach Pincus Zach Pincus
Michael Piotrowski Michael Piotrowski

View File

@ -95,6 +95,9 @@ Extensions
Library Library
------- -------
- Issue #3488: Provide convenient shorthand functions ``gzip.compress``
and ``gzip.decompress``. Original patch by Anand B. Pillai.
- Issue #8807: poplib.POP3_SSL class now accepts a context parameter, which is a - Issue #8807: poplib.POP3_SSL class now accepts a context parameter, which is a
ssl.SSLContext object allowing bundling SSL configuration options, ssl.SSLContext object allowing bundling SSL configuration options,
certificates and private keys into a single (potentially long-lived) certificates and private keys into a single (potentially long-lived)