Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Zipping files/zipfile module

Reply
Thread Tools

Zipping files/zipfile module

 
 
OriginalBrownster
Guest
Posts: n/a
 
      08-02-2006
This will probably sound like a very dumb question.

I am trying to zip some files within a directory.

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?

I am guessing it must be something like the shutile module
something like copy(src,dst)

THank you

Stephen

 
Reply With Quote
 
 
 
 
Brian Beck
Guest
Posts: n/a
 
      08-02-2006
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
 
Reply With Quote
 
 
 
 
Simon Forman
Guest
Posts: n/a
 
      08-02-2006
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

 
Reply With Quote
 
Yves Lange
Guest
Posts: n/a
 
      08-02-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.
 
Reply With Quote
 
Ant
Guest
Posts: n/a
 
      08-02-2006
Enabling directory recursion:

> 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):
> try:
> mkdir(output_path)
> except OSError, e:
> if e.errno == 17: # Path exists
> pass
> zip_file = ZipFile(join(output_path, 'temp.zip'), 'w')


for root, dirs, files in os.walk(dir):
for f in files:
fp = path.join(root, f)
zip_file.write(fp, fp[len(dir):]) # Write to zip as a
path relative to original dir.
> zip_file.close()


 
Reply With Quote
 
Brian Beck
Guest
Posts: n/a
 
      08-02-2006
Yves Lange wrote:
> 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.


Are you sure? This worked about 4 times faster than the zip command line
utility in Linux, compressing the same files...

--
Brian Beck
Adventurer of the First Order
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Zipping dir and avoiding absolute path iksrazal@terra.com.br Java 1 11-11-2005 03:56 PM
Zipping without a file Tyler Reed Java 5 09-16-2004 04:10 PM
Zipping a directory Kasper K Java 1 12-22-2003 11:22 AM
Zipping many files -- each file into its own zip file with same name k* Computer Support 14 07-15-2003 12:26 PM
Zipping Error slumpy Computer Support 3 07-10-2003 07:40 PM



Advertisments