Simple library to compress/uncompress Async streams using file iterator and readers.
It supports the following compression format:
- gzip
- bzip2
- snappy
- zstandard
- parquet (experimental)
- orc (experimental)
Install the library as follows:
pip install asyncstream
Compress a regular file to gzip (examples/simple_compress_gzip.py):
importasyncstreamimportasyncioasyncdefrun():
asyncwithasyncstream.open('samples/animals.txt', 'rb') asfd:
asyncwithasyncstream.open('samples/animals.txt.gz', compression='gzip') asgzfd:
asyncforlineinfd:
awaitgzfd.write(line)
if__name__=='__main__':
asyncio.run(run())or you can also open from an async file descriptor using aiofiles (examples/simple_compress_gzip_with_aiofiles.py):
pip install aiofiles
And then run the following code:
importaiofilesimportasyncstreamimportasyncioasyncdefrun():
asyncwithaiofiles.open('examples/animals.txt', 'rb') asfd:
asyncwithaiofiles.open('/tmp/animals.txt.gz', 'wb') aswfd:
asyncwithasyncstream.open(wfd, 'wb', compression='gzip') asgzfd:
asyncforlineinfd:
awaitgzfd.write(line)
if__name__=='__main__':
asyncio.run(run())You can also uncompress an S3 file on the fly using aiobotocore:
pip install aiobotocore
And then run the following code (examples/simple_uncompress_bzip2_from_s3.py):
importaiobotocoreimportasyncstreamimportasyncioasyncdefrun():
session=aiobotocore.get_session()
asyncwithsession.create_client('s3') ass3:
obj=awaits3.get_object(Bucket='test-bucket', Key='path/to/file.gz')
asyncwithasyncstream.open(obj['Body'], 'rt', compression='bzip2') asfd:
asyncforlineinfd:
print(line)
if__name__=='__main__':
asyncio.run(run())importasyncstreamimportasyncioasyncdefrun():
asyncwithasyncstream.open('samples/animals.txt.gz', 'rb', compression='gzip') asinc_fd:
asyncwithasyncstream.open('samples/animals.txt.snappy', 'wb', compression='snappy') asoutc_fd:
asyncforlineininc_fd:
awaitoutc_fd.write(line)
if__name__=='__main__':
asyncio.run(run())importasyncstreamimportasyncioasyncdefrun():
asyncwithasyncstream.open('/tmp/animals.txt.bz2', 'rb') asin_fd:
asyncwithasyncstream.open('/tmp/animals.txt.snappy', 'wb') asout_fd:
asyncwithasyncstream.reader(in_fd) asreader:
asyncwithasyncstream.writer(out_fd) aswriter:
asyncforname, color, ageinreader:
ifcolor!='white':
awaitwriter.writerow([name, color, age*2])
asyncio.run(run())You will need to install pyarrow and pandas:
pip install pyarrow pandas
To compress using snappy, you can install snappy:
pip install snappy
The code below converts a csv file and convert it to parquet
importasyncstreamimportasyncioasyncdefrun():
asyncwithasyncstream.open('examples/animals.txt', 'rb') asfd:
asyncwithasyncstream.open('output.parquet', 'wb', encoding='parquet', compression='snappy') aswfd:
asyncwithasyncstream.writer(wfd) aswriter:
asyncforlineinfd:
awaitwriter.write(line)
asyncio.run(run())importasyncstreamimportasyncioasyncdefrun():
asyncwithasyncstream.open('output.parquet', 'rb', encoding='parquet') asfd:
asyncwithasyncstream.reader(fd) asreader:
asyncforlineinreader:
print(line)
asyncio.run(run())importasyncstreamimportasyncioasyncdefrun():
asyncwithasyncstream.open('examples/animals.txt', 'rb') asfd:
asyncwithasyncstream.open('output.orc.snappy', 'wb', encoding='orc', compression='snappy') aswfd:
asyncwithasyncstream.writer(wfd) aswriter:
asyncforlineinfd:
awaitwriter.write(line)
asyncio.run(run())importasyncstreamimportasyncioasyncdefrun():
asyncwithasyncstream.open('output.orc.snappy', 'rb', encoding='orc') asfd:
asyncwithasyncstream.reader(fd) asreader:
asyncforlineinreader:
print(line)
asyncio.run(run())Other compression scheme are supported: zlib, brotli.
| Compression | Status |
|---|---|
gzip / zlib | ✅ |
bzip2 | ✅ |
snappy | ✅ |
zstd | ✅ |
| Compression | Status |
|---|---|
| none | ✅ |
brotli | ✅ |
bzip2 | ❌ |
gzip | ❌ |
snappy | ✅ |
zstd | ❌ |
zlib | ✅ |
| Compression | Status |
|---|---|
| none | ✅ |
bzip2 | ❌ |
gzip / zlib | ✅ |
snappy | ✅ |
zlib | ✅ |
zstd | ✅ |