Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   Zipping files/zipfile module (http://www.velocityreviews.com/forums/t362147-zipping-files-zipfile-module.html)

OriginalBrownster 08-02-2006 01:58 AM

Zipping files/zipfile module
 
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


Brian Beck 08-02-2006 03:43 AM

Re: Zipping files/zipfile module
 
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

Simon Forman 08-02-2006 07:23 AM

Re: Zipping files/zipfile module
 
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


Yves Lange 08-02-2006 10:27 AM

Re: Zipping files/zipfile module
 
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.

Ant 08-02-2006 01:32 PM

Re: Zipping files/zipfile module
 
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()



Brian Beck 08-02-2006 02:47 PM

Re: Zipping files/zipfile module
 
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


All times are GMT. The time now is 02:40 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.