Asynchronous gzip file reader/writer with aiocsv support.
Project description
aiogzip ⚡️
An asynchronous library for reading and writing gzip-compressed files.
aiogzip provides a fast, simple, and asyncio-native interface for handling .gz files, making it a useful complement to Python's built-in gzip module for asynchronous applications.
Features
- Truly Asynchronous: Built with
asyncioandaiofiles. - High-Performance: Optimized buffer handling for fast I/O.
- Drop-in Replacement: Mimics
gzip.open()with asyncseek,tell,peek, andreadintosupport; verified against tarfile-style access patterns and aiocsv workflows. - Reproducible Archives: Control gzip
mtimeand embedded filenames. - Type-Safe: Distinct
AsyncGzipBinaryFileandAsyncGzipTextFile. aiocsvReady: Seamless integration for CSV pipelines.- Optional faster codec: Install
aiogzip[fast]to usezlib-ngfor decompression automatically (byte-identical output) and, withfast_compress=True, for compression. - Predictable Performance: Backward seeks rewind the stream and re-decompress data (same as
gzip.GzipFile), so treat random access as O(n) and prefer forward-only patterns when possible.
Append mode and large files
- Append mode (
"ab","at") writes a new gzip member. The file ends up as two (or more) concatenated gzip members. Every standards-compliant reader — includingaiogzip,gzip.open(), and command-linegunzip— transparently concatenates the output, but each additional open writes a new member rather than extending the existing deflate stream. - Backward seeks restart decompression from the beginning of the file, so forward-only access is much faster than mixed-direction access.
- Non-seekable input streams use a bounded rewind cache. By default, up to 128 MiB of compressed input is retained so backward seeks can replay the stream; pass
max_rewind_cache_size=<bytes>to tune this, orNoneto allow an unbounded cache. - Writes past 4 GiB of uncompressed data produce a gzip trailer whose
ISIZEfield wraps tosize & 0xFFFFFFFF(this matches the gzip format spec andgzip.open()). Passstrict_size=Trueto refuse writes that would exceed the limit instead. - Guard against decompression bombs by passing
max_decompressed_size=<bytes>when reading untrusted files; the decompressor aborts withOSErroronce the cap is exceeded. - Use one file object per task. An open
aiogzipfile is not safe for concurrent use by multipleasynciotasks — its internal buffers and decoder/compressor state are mutated without locking, the same contract as standard-library file objects. Give each task its own file object, or serialize access behind your own lock.
Quickstart
pip install aiogzip
# Optional: faster compression/decompression via zlib-ng
pip install "aiogzip[fast]"
When aiogzip[fast] is installed, decompression transparently uses zlib-ng
(its output is byte-identical to stdlib zlib). Compression stays on stdlib by
default so produced .gz bytes are unchanged; opt in per file with
fast_compress=True. Set AIOGZIP_ENGINE=stdlib to force stdlib regardless of
what is installed.
import asyncio
from aiogzip import AsyncGzipFile
async def main():
# Write
async with AsyncGzipFile("file.gz", "wb") as f:
await f.write(b"Hello, async world!")
# Read
async with AsyncGzipFile("file.gz", "rb") as f:
print(await f.read())
# Deterministic metadata
async with AsyncGzipFile(
"dataset.gz", "wb", mtime=0, original_filename="dataset.csv"
) as f:
await f.write(b"stable bytes")
asyncio.run(main())
Default compression level. As a drop-in replacement,
aiogzipmatchesgzip.open()'s API but defaults tocompresslevel=6(the zlib default — a better speed/ratio tradeoff), whereasgzip.open()defaults to9. Passcompresslevel=9for byte-size parity with stdlib defaults:async with AsyncGzipFile("file.gz", "wb", compresslevel=9) as f: await f.write(b"...") # same compression level as gzip.open() defaults
If you cannot use async with, open and close explicitly with try/finally:
f = AsyncGzipFile("file.gz", "rb")
await f.open()
try:
data = await f.read()
finally:
await f.close()
Performance
- Text I/O: Often ~2-3x faster than standard
gzipin bulk text workflows. - Binary I/O: Near parity with
gzipfor bulk writes, with fast bulk reads (a fullread(-1)of compressible data runs at several hundred MB/s); can be slower for very small chunk sizes. - Concurrency: CPU-heavy
zlibcompress/decompress calls run in the default executor above a 256 KiB threshold, so multiple gzip streams on the same event loop compress and decompress in parallel instead of serializing on the loop thread. The repo's concurrent-I/O benchmark runs ~4x faster since this landed in 1.4.0; single-stream throughput stays at parity. - Line Iteration: For the single-character newline modes (
None,"\n","\r"), lines are bulk-split per chunk and served from a batch, makingasync for/readline()roughly ~1.2–1.3x faster (~4M lines/sec). - Optional faster codec: With
aiogzip[fast]installed, decompression useszlib-ngautomatically (~1.2-2x on typical data, up to ~7-10x on highly compressible bulk reads; byte-identical output), andfast_compress=Truegives ~1.2-1.5x compression. See the Performance Guide. - Memory: Optimized buffer management for stable memory usage.
- JSONL: For large gzipped JSONL files, prefer
AsyncGzipTextFile(..., newline="\n", chunk_size=512 * 1024)to reduce line-iteration overhead.
See the Performance Guide for detailed benchmarks.
Python version support
aiogzip 1.x supports Python 3.8-3.14. The 1.x line is the last to support
Python 3.8 and 3.9 (both past end-of-life); aiogzip 2.0 will require
Python 3.11+. Older interpreters will continue to resolve the latest 1.x
release from PyPI automatically.
Contributing
See the Contributing Guide for development instructions.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file aiogzip-1.9.0.tar.gz.
File metadata
- Download URL: aiogzip-1.9.0.tar.gz
- Upload date:
- Size: 135.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b3867129dd6e77c26a444bb443f17adc58ea8d3d0b21dfdf6c9eb9e0b4356e76
|
|
| MD5 |
e2159d11f116d36d17810bf7239c2a26
|
|
| BLAKE2b-256 |
2da6c1a95332714e6bcbd93c6b37c5cf4da8c66f0c36aabcd162d1945b02bdb1
|
Provenance
The following attestation bundles were made for aiogzip-1.9.0.tar.gz:
Publisher:
publish.yml on geoff-davis/aiogzip
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aiogzip-1.9.0.tar.gz -
Subject digest:
b3867129dd6e77c26a444bb443f17adc58ea8d3d0b21dfdf6c9eb9e0b4356e76 - Sigstore transparency entry: 2049895757
- Sigstore integration time:
-
Permalink:
geoff-davis/aiogzip@38a26620e7a86da754438e10e30acbd5d46b1d4c -
Branch / Tag:
refs/tags/v1.9.0 - Owner: https://github.com/geoff-davis
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@38a26620e7a86da754438e10e30acbd5d46b1d4c -
Trigger Event:
push
-
Statement type:
File details
Details for the file aiogzip-1.9.0-py3-none-any.whl.
File metadata
- Download URL: aiogzip-1.9.0-py3-none-any.whl
- Upload date:
- Size: 38.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c79eb39a450a8d4c61a4b56dc1da8331d7601a358b513c1898bc4ed03c976822
|
|
| MD5 |
7eaf3845b2030fea370cb6abedbbc520
|
|
| BLAKE2b-256 |
b31df1e910eb7c2f3c4cdaa20c6db69d8ea96d233d8d8e2924d1b0d50497e74c
|
Provenance
The following attestation bundles were made for aiogzip-1.9.0-py3-none-any.whl:
Publisher:
publish.yml on geoff-davis/aiogzip
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
aiogzip-1.9.0-py3-none-any.whl -
Subject digest:
c79eb39a450a8d4c61a4b56dc1da8331d7601a358b513c1898bc4ed03c976822 - Sigstore transparency entry: 2049896354
- Sigstore integration time:
-
Permalink:
geoff-davis/aiogzip@38a26620e7a86da754438e10e30acbd5d46b1d4c -
Branch / Tag:
refs/tags/v1.9.0 - Owner: https://github.com/geoff-davis
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@38a26620e7a86da754438e10e30acbd5d46b1d4c -
Trigger Event:
push
-
Statement type: