Recursive zipping of Directories in Windows

Jandre jandre_balt at yahoo.co.uk
Sun Feb 4 14:42:23 EST 2007


On Feb 1, 9:39 pm, Larry Bates <larry.ba... at websafe.com> wrote:
> Jandre wrote:
> > Hi
>
> > I am a python novice and I am trying to write a python script (most of
> > the code is borrowed) to Zip a directory containing some other
> > directories and files. The script zips all the files fine but when it
> > tries to zip one of the directories it fails with the following
> > error:
> > "IOError: [Errno 13] Permission denied: 'c:\\aaa\\temp'"
>
> > The script I am using is:
>
> > import zipfile, os
>
> > def toZip( directory, zipFile ):
> >     """Sample for storing directory to a ZipFile"""
> >     z = zipfile.ZipFile(
> >         zipFile, 'w', compression=zipfile.ZIP_DEFLATED
> >     )
> >     def walker( zip, directory, files, root=directory ):
> >         for file in files:
> >             file = os.path.join( directory, file )
> >             # yes, the +1 is hacky...
> >             archiveName = file[len(os.path.commonprefix( (root,
> > file) ))+1:]
> >             zip.write( file, archiveName, zipfile.ZIP_DEFLATED )
> >             print file
> >     os.path.walk( directory, walker, z  )
> >     z.close()
> >     return zipFile
>
> > if __name__ == "__main__":
> >     toZip( 'c:\\aaa', 'c:\\aaa\\test.zip' )
>
> > I have tried to set the permissions on the folder, but when I check
> > the directory permissions it is set back to "Read Only"
>
> > Any suggestions?
>
> > Thanks
> > Johan Balt
>
> Couple of quick suggestions that may help:
>
> 1) don't use 'file' as a variable name. It will mask
> the builtin file function.  If it hasn't bitten you before
> it will if you keep doing that.
>
> 2) If you put the target .zip file in the directory you are
> backing what do you expect the program to do when it comes
> to the file you are creating as you walk the directory?  You
> haven't done anything to 'skip' it.
>
> 3) Your commonprefix and +1 appears to result in same
> information that the easier to use os.path.basename()
> would give you.  Double check me on that.
>
> I don't see anything that references C:\\aaa\temp in your
> code.  Does it exist on your hard drive?  If so does it
> maybe contain temp files that are open?  zipfile module
> can't handle open files.  You must use try/except to
> catch these errors.
>
> Hope info helps.
>
> -Larry

Thank you Larry.
I've changed the code as epr your advice. The code is now:

import zipfile, os

def toZip( directory, zipFile ):
    """Sample for storing directory to a ZipFile"""
    z = zipfile.ZipFile(
        zipFile, 'w', compression=zipfile.ZIP_DEFLATED
    )
    def walker( zip, directory, files, root=directory ):
        for f in files:
            f = os.path.join( directory, f )
            archiveName = os.path.basename(f)
            zip.write( f, archiveName, zipfile.ZIP_DEFLATED )
            print f
    os.path.walk( directory, walker, z  )
    z.close()
    return zipFile


if __name__ == "__main__":
    toZip( 'c:\\aaa\\', 'c:\\bbb\\test.zip' )

I still get the same error:
Traceback (most recent call last):
  File "C:\Python24\Lib\site-packages\pythonwin\pywin\framework
\scriptutils.py", line 310, in RunScript
    exec codeObject in __main__.__dict__
  File "C:\Python24\Scripts\dirZip.py", line 20, in ?
    toZip( 'c:\\aaa\\', 'c:\\bbb\\test.zip' )
  File "C:\Python24\Scripts\dirZip.py", line 14, in toZip
    os.path.walk( directory, walker, z  )
  File "C:\Python24\lib\ntpath.py", line 329, in walk
    func(arg, top, names)
  File "C:\Python24\Scripts\dirZip.py", line 12, in walker
    zip.write( f, archiveName, zipfile.ZIP_DEFLATED )
  File "C:\Python24\lib\zipfile.py", line 405, in write
    fp = open(filename, "rb")
IOError: [Errno 13] Permission denied: 'c:\\aaa\\temp'

c:\\aaa\\temp is a directory in the directory I an trying to zip. I
want to use this script to back up my work once a day and would like
to
keep the directory structure as is. I can zip the files in c:\aaa\tem
fine so I guess that there aren't any open files in the directory.
Any more ideas?




More information about the Python-list mailing list