Zipping files/zipfile module

Yves Lange yves.lange at bluewin.ch
Wed Aug 2 06:27:25 EDT 2006


Simon Forman a écrit :
> Brian Beck wrote:
>> OriginalBrownster wrote:
>>> I want to zip all the files within a directory called "temp"
>>> and have the zip archive saved in a directory with temp called ziptemp
>>>
>>> I was trying to read up on how to use the zipfile module python
>>> provides, but I cannot seem to find adequate documentation on function
>>> itself.
>>>
>>> Perhaps someone could help me in this task?
>> Hello,
>>
>> This isn't completely tested, but perhaps it will help you get started:
>>
>> from os import listdir, mkdir
>> from os.path import join, basename, isfile
>> from zipfile import ZipFile
>>
>> def zip_dir(path, output_path, include_hidden=True):
>>     files = [join(path, f) for f in listdir(path) if isfile(join(path, f))]
>>     try:
>>         mkdir(output_path)
>>     except OSError, e:
>>         if e.errno == 17: # Path exists
>>             pass
>>     zip_file = ZipFile(join(output_path, 'temp.zip'), 'w')
>>     for f in files:
>>         if basename(f).startswith('.') and not include_hidden:
>>             continue
>>         print "Adding %s to archive..." % (f,)
>>         zip_file.write(f)
>>     zip_file.close()
>>
>> Use like:
>>     zip_dir('temp', 'temp/ziptemp')
>>
>> Note that if you want to add the entire contents of a directory
>> (subdirectories, recursively), you should consider using os.walk or
>> something similar. This will only add the file contents of the directory.
>> I'm not sure if the zipfile module provides any nice ways to write
>> directories to the archive, but I'm assuming it just involves writing an
>> arcname with a '/' in it (see help(zipfile.ZipFile)).
>>
>> --
>> Brian Beck
>> Adventurer of the First Order
> 
> To avoid calling os.path.join() twice for each filename when you build
> the list of files you could write the list comprehension like so:
> 
> [n for n in (join(path, f) for f in listdir(path)) if isfile(n)]
> 
> Also, you should use the "symbolic" errors from the errno module rather
> than hard-coding a constant:
> 
> from errno import EEXIST
> ...
> if e.errno == EEXIST: # Path exists
> 
> Finally, if your using a single arg with a string interpolation and you
> know it'll never be a tuple you needn't wrap it in a tuple:
> 
> print "Adding %s to archive..." % f
> 
Other solutions:
you can try the rar command line from WinRar but it's not recommended. 
This is a very slow manner to compress file. Or you can try the Bz 
module of python.



More information about the Python-list mailing list