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.3.0.tar.gz (26.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.3.0-py3-none-any.whl (21.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: splitzip-0.3.0.tar.gz
  • Upload date:
  • Size: 26.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.3.0.tar.gz
Algorithm Hash digest
SHA256 5099bf0d9e89413e38105333154752274b5ea897e660c4556287ccaee73f50a9
MD5 6f1a2d09a222ac10869cdacefb66dd92
BLAKE2b-256 bb9c446f6ba767380e35a45d0754f4bf383a58c515a36203b8f105c31b32a751

See more details on using hashes here.

Provenance

The following attestation bundles were made for splitzip-0.3.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.3.0-py3-none-any.whl.

File metadata

  • Download URL: splitzip-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 21.3 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.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2b4d4dea44a4ea6f6e50d25d3563e2987f6e7c96bad3a25f751ffb552309018c
MD5 c0f6fa8b6692c4143267209761dcd050
BLAKE2b-256 eeeb3bb8b7ab2d25d8c41e71ad25b4c0a384992c30abc4b06592218659016d24

See more details on using hashes here.

Provenance

The following attestation bundles were made for splitzip-0.3.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