Create .zip in Python?
The zipfile.write()
method takes an optional arcname
argumentthat 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 Iuse os.path.abspath()
to make sure that both src
and thefilename returned by os.walk()
have a common prefix.
#!/usr/bin/env python2.7import osimport zipfiledef 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/foozipping 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
From what I can tell you are close. You could use dirname
and basename
to make sure you are grabbing the right path name:
>>> os.path.dirname("/path/to/dst")'/path/to'>>> os.path.basename("/path/to/dst")'dst'
Then using chdir
you can make sure you are in the parent so the paths are relative.
def zip(src, dst): parent = os.path.dirname(dst) folder = os.path.basename(dst) os.chdir(parent): for dirname, subdirs, filenames in os.walk(folder): ...
This creates:
dst/a.txtdst/bdst/b/c.txt...etc...
If do not want to include the name "dst" you can just do os.chdir(dst)
and then os.walk('.')
.
Hope that helps.
Use the arcname
parameter to control the name/path in the zip file.
For example, for a zip file that contains only files, no directories:
zf.write(os.path.join(dirname, filename), arcname=filename)
Or to invent a new directory inside the zip file:
zf.write(os.path.join(dirname, filename), arcname=os.path.join("my_zip_dir", filename))