[Tutor] How to skip a single file when using shutil.make_archive()

Peter Otten __peter__ at web.de
Sat Aug 15 08:20:25 CEST 2015

Anthony Papillion wrote:

> I'm creating an archive of a directory using shutil.make_archive and need
> to skip a single file if it is present in that directory. Is there a way
> to do this or should I be looking to ZipFile to meet this need?

I should not post this, especially on a tutor list, but as you already have 
a fairly robust solution here's an evil hack:

$ cat make_partial_archive.py
#!/usr/bin/env python3
import os
import shutil
from unittest.mock import patch

_os_path_isfile = os.path.isfile

def accept(path):
    if path in ["delta/one.txt", "beta.txt"]:
        print("skipping %r" % path)
        return False
    return _os_path_isfile(path)

if __name__ == "__main__":
    with patch("os.path.isfile", side_effect=accept):
        shutil.make_archive("archive", "zip", "data")
$ tree data
├── alpha.txt
├── beta.txt
├── delta
│   ├── one.txt
│   ├── three.txt
│   └── two.txt
└── gamma.txt

1 directory, 6 files
$ python3 make_partial_archive.py 
skipping 'beta.txt'
skipping 'delta/one.txt'
$ unzip archive.zip -d tmp
Archive:  archive.zip
  inflating: tmp/gamma.txt           
  inflating: tmp/alpha.txt           
  inflating: tmp/delta/two.txt       
  inflating: tmp/delta/three.txt     

Explanation: The script manipulates the make_archive() implementation for 
zip files by temporarily replacing os.path.isfile() with a custom accept() 

More information about the Tutor mailing list