Skip to main content

Create split ZIP archives compatible with standard tools

Project description

PyPI version Python versions License

splitzip

Create split ZIP archives compatible with standard tools.

No 7-Zip required. Archives created with splitzip can be extracted using Windows Explorer, WinZip, macOS Archive Utility, and standard unzip on Linux.

Features

  • Pure Python, no external dependencies
  • Compatible with standard ZIP tools (no proprietary formats)
  • Human-friendly size specifications ("100MB", "700MiB", "4.7GB")
  • Progress callbacks for large files
  • Context manager support
  • CLI tool included

Installation

pip install splitzip

Quick Start

Simple Usage

import splitzip

# Create a split archive from files
splitzip.create(
    "backup.zip",
    ["documents/", "photos/", "important.pdf"],
    split_size="650MB"
)

Output files: backup.z01, backup.z02, ..., backup.zip

Context Manager

from splitzip import SplitZipWriter

with SplitZipWriter("backup.zip", split_size="100MB") as zf:
    # Add files
    zf.write("document.pdf")
    zf.write("photos/", recursive=True)
    
    # Add with custom name
    zf.write("secret.txt", arcname="data/renamed.txt")
    
    # Add content directly
    zf.writestr("hello.txt", b"Hello, World!")
    zf.writestr("config.json", '{"key": "value"}')

Advanced Options

from splitzip import SplitZipWriter, STORED, DEFLATED

def on_progress(filename, bytes_done, total_bytes):
    pct = (bytes_done / total_bytes) * 100
    print(f"\r{filename}: {pct:.1f}%", end="")

def on_volume(volume_num, path):
    print(f"Created volume: {path}")

with SplitZipWriter(
    "backup.zip",
    split_size="700MiB",          # DVD size
    compression=DEFLATED,          # or STORED for no compression
    compresslevel=9,               # 1-9 (default: 6)
    on_volume=on_volume,           # Volume creation callback
    on_progress=on_progress,       # Progress callback
) as zf:
    zf.write("large_file.bin")

Streaming from File Objects

import io
from splitzip import SplitZipWriter

data = get_data_from_somewhere()

with SplitZipWriter("archive.zip", split_size="100MB") as zf:
    zf.write_fileobj(
        io.BytesIO(data),
        arcname="streamed.bin",
        size=len(data)  # Optional, enables progress callback
    )

Size Specifications

splitzip accepts sizes in multiple formats:

Format Example Bytes
Integer 104857600 104,857,600
Bytes "100B" 100
Kilobytes (decimal) "100KB" 100,000
Megabytes (decimal) "100MB" 100,000,000
Gigabytes (decimal) "1GB" 1,000,000,000
Kibibytes (binary) "100KiB" 102,400
Mebibytes (binary) "700MiB" 734,003,200
Gibibytes (binary) "1GiB" 1,073,741,824

Common split sizes:

  • CD-ROM: "650MB" or "700MB"
  • FAT32 limit: "4GiB" (minus 1 byte)
  • Email attachment: "25MB"

Command Line Interface

# Create a split archive
splitzip create -o backup.zip -s 100MB file1.txt directory/

# With options
splitzip create -o backup.zip -s 700MiB \
    --level 9 \           # Max compression
    --verbose \           # Show progress
    documents/ photos/

# Store without compression
splitzip create -o backup.zip -s 100MB --store largefile.bin

Output File Naming

splitzip follows the standard ZIP split archive convention:

backup.z01  (first volume)
backup.z02  (second volume)
backup.z03  (third volume)
...
backup.zip  (final volume, contains central directory)

All files must be present in the same directory for extraction.

Compatibility

Tool Single Volume Split Archive
Windows Explorer
WinZip
7-Zip
macOS Archive Utility ✅*
Linux unzip ✅**
Python zipfile

* May require all files to be selected and opened together
** May require unzip -F flag for split archives

API Reference

SplitZipWriter(path, split_size, compression=DEFLATED, compresslevel=6, on_volume=None, on_progress=None)

  • path (str | Path): Path for the final .zip file.
  • split_size (int | str): Maximum size per volume (bytes or human-readable string).
  • compression (int): DEFLATED (default) or STORED.
  • compresslevel (int): DEFLATE level 1–9 (default 6).
  • on_volume ((int, Path) -> None | None): Called when a volume is created.
  • on_progress ((str, int, int) -> None | None): Called with (filename, bytes_done, total_bytes).

Methods

  • write(path, arcname=None, recursive=True, compression=None, compresslevel=None) — Add a file or directory. Set recursive=False to add only the directory entry without contents. Symlinks are skipped.
  • writestr(arcname, data, compression=None, compresslevel=None) — Write bytes/str directly.
  • write_fileobj(fileobj, arcname, size=None, compression=None, compresslevel=None) — Write from a file-like object.
  • close() — Finalize the archive. Returns list of volume paths.

Exceptions

Exception When raised
SplitZipError Base exception for all splitzip errors
VolumeError Volume management errors
VolumeTooSmallError Split size too small for headers
UnsafePathError Path traversal detected (zip slip)
CompressionError Compression failure
IntegrityError CRC mismatch

Limitations

  • Minimum volume size: 64KB
  • No ZIP64 support: Individual files must be under 4GB, total entries under 65,535
  • No encryption: Use filesystem encryption for sensitive data
  • No reading/extraction: This is a write-only library (use standard tools to extract)
  • No ZSTD/LZMA: Only DEFLATE and STORED compression (for compatibility)
  • Symlinks are skipped: Symbolic links are ignored with a warning

Development

# Clone and install in development mode
git clone https://github.com/twwat/splitzip
cd splitzip
pip install -e ".[dev]"

# Run tests
pytest

# Run with coverage
pytest --cov=splitzip

# Type checking
mypy src/splitzip

# Linting
ruff check src/splitzip

License

MIT License. See LICENSE for details.

Contributing

Contributions welcome! Please open an issue to discuss major changes before submitting a PR.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

splitzip-0.2.0.tar.gz (24.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

splitzip-0.2.0-py3-none-any.whl (20.7 kB view details)

Uploaded Python 3

File details

Details for the file splitzip-0.2.0.tar.gz.

File metadata

  • Download URL: splitzip-0.2.0.tar.gz
  • Upload date:
  • Size: 24.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for splitzip-0.2.0.tar.gz
Algorithm Hash digest
SHA256 0795108ac55d0b72383c4f96082f46eee424aa026215cb180d7be41f3a74db77
MD5 b7e1e74e9a7ae2608126cf920271160c
BLAKE2b-256 76a7d1d9c8b3d1a0374b87c9d85bab5683beeb12742905551516a1904ba2e877

See more details on using hashes here.

Provenance

The following attestation bundles were made for splitzip-0.2.0.tar.gz:

Publisher: publish.yml on twwat/splitzip

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file splitzip-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: splitzip-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 20.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for splitzip-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 74a77898bcbb0e5b6aa3e3c37e45acd5df0f8ef15df7d1eeea0489ba8f682571
MD5 cfd424caf9ff8e0254aa7d448f8581b4
BLAKE2b-256 c3e04a340dc8a30bc4a220cfd35d8dc0874e427beb89d58c3ef0364f3164ce93

See more details on using hashes here.

Provenance

The following attestation bundles were made for splitzip-0.2.0-py3-none-any.whl:

Publisher: publish.yml on twwat/splitzip

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page