Zipping files/zipfile module

  • Thread starter OriginalBrownster
  • Start date
O

OriginalBrownster

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
 
B

Brian Beck

OriginalBrownster said:
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)).
 
S

Simon Forman

Brian said:
OriginalBrownster said:
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)).

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
 
Y

Yves Lange

Simon Forman a écrit :
Brian said:
OriginalBrownster said:
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)).

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.
 
A

Ant

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.
 
B

Brian Beck

Yves said:
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...
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,564
Members
45,039
Latest member
CasimiraVa

Latest Threads

Top