recursion - Recursively append files to zip archive in python -
in python 2.7.4 on windows, if have directory structure follows:
test/foo/a.bak test/foo/b.bak test/foo/bar/c.bak test/d.bak and use following add them existing archive such 'd.bak' @ root of archive:
import zipfile import os.path import fnmatch def find_files(directory, pattern): root, dirs, files in os.walk(directory): basename in files: if fnmatch.fnmatch(basename, pattern): filename = os.path.join(root, basename) yield filename if __name__=='__main__': z = zipfile.zipfile("testarch.zip", "a", zipfile.zip_deflated) filename in find_files('test', '*.*'): print 'found file:', filename z.write(filename, os.path.basename(filename), zipfile.zip_deflated) z.close() the directory of zip file flat. creates foo/ directory only if sub-directory exists in (if exclude test/foo/bar/c.bak, not create directory. if included, foo/ created not foo/bar/ if makes sense), no sub-directories or files:
foo/ a.bak b.bak c.bak d.bak am missing something?
the problem you're explicitly asking flatten paths:
z.write(filename, os.path.basename(filename), zipfile.zip_deflated) if @ the docs, default arcname is:
the same
filename, without drive letter , leading path separators removed
but you're overriding os.path.basename(filename). (if don't know basename does, returns "the last pathname component". if don't want last pathname component, don't call basename.)
if z.write('test/foo/bar/c.bak'), create zip entry named test/foo/bar/c.bak, if z.write('test/foo/bar/c.bak', 'c.bak'), create zip entry named c.bak. since of entries, whole thing ends flattened.
Comments
Post a Comment