The Bits That Python's zipfile Forgot

Meet ziptools, a free program and library that lets you create and extract zipfiles on all your devices, using sorely needed tools not available in Python's built-in zipfile support. Overview

ziptools is both an importable module package and a collection of command-line scripts that create and extract zipfiles. It augments Python's

zipfile

module with crucial missing functionality. Most notable among ziptools' enhancements:

Folders: ziptools adds entire folder trees to zipfiles automatically Modtimes: ziptools propagates original modtimes for files, folders, and links in full Cruft skips: ziptools can either include or skip system "cruft" files on request Symlinks: ziptools copies or follows symlinks to files and folders on Unix and Windows Long paths: ziptools supports long pathnames on Windows beyond its normal limits Permissions: ziptools propagates Unix file-access permissions for all items on request Timestamps: ziptools fixes DST and timezone skew in modtimes with UTC timestamps Filenames: ziptools makes nonportable-filename mods explicit, optional, and avoidable There's more on ziptools' features

here

. ziptools is also portable—it can create and extract standard-conforming zipfiles on

Mac OS

,

Windows

,

Linux

,

Android

, and others, and it can serve as your sole zip and unzip utility on all these platforms. Simply use the local Python 3.X or 2.X, or install one where needed; ziptools works on either Python.

Usage

To get started with ziptools:

Read its HTML

docs

Fetch its full

package

Browse its unzipped

content

View its usage

screenshot

Grok its console

demo

The package's main

create

and

extract

scripts also come with loads of in-program documentation, as does its importable

module

used by the scripts. For code size, see the

sloc

.

And yes, ziptools zipped itself like this:

/...code$ python3 $Z/zip-create.py ziptools.zip ziptools -skipcruft -nocompress Running ziptools 1.3 Zipping ['ziptools'] to ziptools.zip Cruft patterns: {'skip': ['.*', '[dD]esktop.ini', 'Thumbs.db', '~*', '$*', '*.py[co]'], 'keep': ['.htaccess*']} Adding folder ziptools --Skipped cruft file ziptools/.DS_Store Adding file ziptools/.htaccess Adding file ziptools/__init__.py Adding folder ziptools/cmdtest --Skipped cruft file ziptools/cmdtest/.DS_Store Adding file ziptools/cmdtest/_HOW-RUN.txt ...etc... Adding file ziptools/ziptools/ziptools.py --Skipped cruft file ziptools/ziptools/ziptools.pyc Create finished: files=513, folders=264, links=0, unknowns=0, crufts=31. If you had already installed ziptools, you could unzip its package like this (but use your local unzip tool the first time around):

/...site$ $Z/zip-extract.py ziptools.zip . -permissions -nomangle Running ziptools 1.3 Unzipping from ziptools.zip to . Extracted ziptools/ Extracted ziptools/.htaccess Extracted ziptools/__init__.py Extracted ziptools/cmdtest/ Extracted ziptools/cmdtest/_HOW-RUN.txt ...etc... Extracted ziptools/ziptools/ziptools.py Extract finished: files=513, folders=264, links=0, unknowns=0. For info on ziptools command-lines, try

this

. For examples of other programs that build ziptools command lines on the fly, search for ziptools in genhtml's scripts

here

and

here

. And for details on importing and calling ziptools' tools more directly, see its

examples

and

code docs

.

Etcetera

Mergeall's version ziptools is also included as a nested tool in the

Mergeall

content backup/mirror program because it was initially developed for testing that system. See its top-level test/ziptools folder if you've already fetched a Mergeall package. The version of ziptools included in Mergeall is that current when Mergeall was packaged but may be out of date; the latest version is always

here

. Latest upgrades This program was rebuilt and reuploaded in Dec-2024 and again in Jun-2025 to avoid new errors generated by Python 3.13 and later for unrecognized "\" escape sequences in string literals, which were harmless, deemed okay for three decades, and widely used, especially in docstrings. This was a trivial tactical mod—an "r" was added before some docstrings to subvert escapes—and no program functionality was changed. This program was last changed on October 28, 2021. Its most recent

releases

feature an uncompressed option for zip/unzip

speed

; nonportable-filename

support

; filename

wildcards

on Windows; end-of-run

statistics

; optional

permissions

propagation; alternate

zip paths

; and UTC

timestamps

. Many of these changes can be sampled at their demos: the permissions upgrade is meant for use with zipfiles originating on

Unix

; the UTC-timestamp upgrade neutralizes DST and timezone changes for all items' modtimes by using extra zip fields instead of zip's local

time

; and the new filename support applies to unzips on Android and

Windows

.

For more code examples, see the

programs

page.