The zipfile.write()
method takes an optional arcname
argument
that specifies what the name of the file should be inside the zipfile.
You can use this to strip off the path to src
at the beginning. Here I
use os.path.abspath()
to make sure that both src
and the
filename returned by os.walk()
have a common prefix.
#!/usr/bin/env python2.7
import os
import zipfile
def zip(src, dst):
zf = zipfile.ZipFile("%s.zip" % (dst), "w", zipfile.ZIP_DEFLATED)
abs_src = os.path.abspath(src)
for dirname, subdirs, files in os.walk(src):
for filename in files:
absname = os.path.abspath(os.path.join(dirname, filename))
arcname = absname[len(abs_src) + 1:]
print 'zipping %s as %s' % (os.path.join(dirname, filename),
arcname)
zf.write(absname, arcname)
zf.close()
zip("src", "dst")
With a directory structure like this:
src
└── a
├── b
│ └── bar
└── foo
The script prints:
zipping src/a/foo as a/foo
zipping src/a/b/bar as a/b/bar
And the contents of the resulting zip file are:
Archive: dst.zip
Length Date Time Name
-------- ---- ---- ----
0 01-28-13 11:36 a/foo
0 01-28-13 11:36 a/b/bar
-------- -------
0 2 files