Recursive zipping of Directories in Windows

MRAB google at mrabarnett.plus.com
Tue Feb 6 15:47:06 EST 2007


On Feb 6, 1:48 am, "joshbl... at gmail.com" <joshbl... at gmail.com> wrote:
> On Feb 4, 12:42 pm, "Jandre" <jandre_b... at yahoo.co.uk> wrote:
>
>
>
> > 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?
>
> Hi Jandre,
>
> Your code is treating the directory as a file and trying to open it
> and read its bytes to zip them. You'll need to differentiate between
> files and directories.
>
> You'll need to check out the Zip module to see how it expects files
> that should be nested within folders. I believe you'll need to set the
> archive name for the nested files to something like \\temp\\file.ext
> etc.
>
In my experience, zip files don't contain nested folders, instead they
contain a 'flat' list of files. Files in subfolders are represented by
relative path names containing slashes and empty subfolders are
represented by relative paths ending in a slash,.for example
"File1.txt", "Folder1/File2.dat", "Folder2/Folder3/". This seems to
work for me! :-)





More information about the Python-list mailing list