Quick Start

Synchronous usage

List files in a remote ZIP

from zipwire import SyncRemoteZip
from zipwire.backends import Urllib3Reader

reader = Urllib3Reader("https://archive.example/data.zip")
with SyncRemoteZip(reader) as rz:
    for info in rz.infolist():
        print(f"{info.filename}  {info.file_size} bytes")

Read a single file into memory

from zipwire import SyncRemoteZip
from zipwire.backends import Httpx2SyncReader

reader = Httpx2SyncReader("https://archive.example/data.zip")
with SyncRemoteZip(reader) as rz:
    data = rz.read("path/to/file.txt")

Stream a file to disk

read_into() streams the compressed payload in chunks and decompresses on the fly, keeping peak memory low even for large entries:

from zipwire import SyncRemoteZip
from zipwire.backends import RequestsReader

reader = RequestsReader("https://archive.example/large.zip")
with SyncRemoteZip(reader) as rz:
    with open("output.bin", "wb") as f:
        rz.read_into("big-file.bin", f)

Asynchronous usage

Async with aiohttp

import asyncio

from zipwire import AsyncRemoteZip
from zipwire.backends import AiohttpReader


async def main():
    reader = AiohttpReader("https://archive.example/data.zip")
    async with AsyncRemoteZip(reader) as rz:
        data = await rz.read("path/to/file.txt")
        print(data.decode())


asyncio.run(main())

Async with httpx2

import asyncio

from zipwire import AsyncRemoteZip
from zipwire.backends import Httpx2AsyncReader


async def main():
    reader = Httpx2AsyncReader("https://archive.example/data.zip")
    async with AsyncRemoteZip(reader) as rz:
        names = await rz.namelist()
        print(names)


asyncio.run(main())

Async streaming to disk

import asyncio

from zipwire import AsyncRemoteZip
from zipwire.backends import AiohttpReader


async def main():
    reader = AiohttpReader("https://archive.example/large.zip")
    async with AsyncRemoteZip(reader) as rz:
        with open("output.bin", "wb") as f:
            await rz.read_into("big-file.bin", f)


asyncio.run(main())

Passing a pre-configured client

All backends accept an optional pre-configured client or session:

import httpx2

from zipwire import SyncRemoteZip
from zipwire.backends import Httpx2SyncReader

with httpx2.Client(headers={"Authorization": "Bearer token"}) as client:
    reader = Httpx2SyncReader(
        "https://archive.example/data.zip", client=client
    )
    with SyncRemoteZip(reader) as rz:
        data = rz.read("secret.txt")