def bytes2zip(bytes): """ RETURN COMPRESSED BYTES """ if hasattr(bytes, "read"): buff = TemporaryFile() archive = gzip.GzipFile(fileobj=buff, mode='w') for b in bytes: archive.write(b) archive.close() buff.seek(0) return FileString(buff) buff = BytesIO() archive = gzip.GzipFile(fileobj=buff, mode='w') archive.write(bytes) archive.close() return buff.getvalue()
class GmlZBuffer(io.IOBase): ''' ''' def __init__(self): self.buffer = StringIO() self.compressor = zlib.compressobj(6, ZIP_DEFLATED, -9) self.overflow = False self.crc = 0 self.uncompressed_size = 0 self.compressed_size = 0 self.compressed_chunk_mark = 0 def write(self, data): self.crc = zlib.crc32(data, self.crc) & 0xffffffff self.uncompressed_size += len(data) compressed_data = self.compressor.compress(data) if not (compressed_data and len(compressed_data)): return 0 compressed_size = len(compressed_data) self._prepare_write(compressed_size) self.buffer.write(compressed_data) self.compressed_size += compressed_size return compressed_size def _prepare_write(self, length): if self.overflow: return if self.buffer.tell() + length > _GMLZBUFFER_MAX_SIZE: data = self.buffer.getvalue() self.buffer.close() self.buffer = TemporaryFile() self.buffer.write(data) self.overflow = True def flush(self): prev_mark = self.mark compressed_data = self.compressor.flush(zlib.Z_FULL_FLUSH) compressed_size = len(compressed_data) self._prepare_write(compressed_size) self.buffer.write(compressed_data) self.compressed_size += compressed_size self.mark = self.buffer.tell() return prev_mark, self.mark