Zipping files/zipfile module

Simon Forman rogue_pedro at yahoo.com
Wed Aug 2 03:23:26 EDT 2006


Brian Beck wrote:
> OriginalBrownster wrote:
> > I want to zip all the files within a directory called "temp"
> > and have the zip archive saved in a directory with temp called ziptemp
> >
> > I was trying to read up on how to use the zipfile module python
> > provides, but I cannot seem to find adequate documentation on function
> > itself.
> >
> > Perhaps someone could help me in this task?
>
> Hello,
>
> This isn't completely tested, but perhaps it will help you get started:
>
> from os import listdir, mkdir
> from os.path import join, basename, isfile
> from zipfile import ZipFile
>
> def zip_dir(path, output_path, include_hidden=True):
>     files = [join(path, f) for f in listdir(path) if isfile(join(path, f))]
>     try:
>         mkdir(output_path)
>     except OSError, e:
>         if e.errno == 17: # Path exists
>             pass
>     zip_file = ZipFile(join(output_path, 'temp.zip'), 'w')
>     for f in files:
>         if basename(f).startswith('.') and not include_hidden:
>             continue
>         print "Adding %s to archive..." % (f,)
>         zip_file.write(f)
>     zip_file.close()
>
> Use like:
>     zip_dir('temp', 'temp/ziptemp')
>
> Note that if you want to add the entire contents of a directory
> (subdirectories, recursively), you should consider using os.walk or
> something similar. This will only add the file contents of the directory.
> I'm not sure if the zipfile module provides any nice ways to write
> directories to the archive, but I'm assuming it just involves writing an
> arcname with a '/' in it (see help(zipfile.ZipFile)).
>
> --
> Brian Beck
> Adventurer of the First Order

To avoid calling os.path.join() twice for each filename when you build
the list of files you could write the list comprehension like so:

[n for n in (join(path, f) for f in listdir(path)) if isfile(n)]

Also, you should use the "symbolic" errors from the errno module rather
than hard-coding a constant:

from errno import EEXIST
...
if e.errno == EEXIST: # Path exists

Finally, if your using a single arg with a string interpolation and you
know it'll never be a tuple you needn't wrap it in a tuple:

print "Adding %s to archive..." % f




More information about the Python-list mailing list