Developer

Writing and appending to zip archives in Python

Following up from last week's article on reading zip archives, we show you how you can create your own archives using Python.

Following up from last week's article on reading zip archives, we show you how you can create your own archives using Python.

If you missed the article last week on reading zip files, then I suggest you go back and give it a quick once over. We'll be using the same files from that example: two text files called "file1.txt" and "file2.txt".

If you just want a new zip file with your files in it, then it's a matter of a few lines using the zipfile module. First, create the archive in write mode:


>>> import zipfile
>>> z = zipfile.ZipFile("test2.zip", "w")

Then start adding files:


>>> z.write("file1.txt")
>>> z.write("file2.txt")

That's essentially it. The zipfile module handles all the details of opening and reading the files, compressing them and inserting them into the archive. Don't believe me? Then let's take a look. First we close the file, then reopen it in read mode.


>>> z.close()
>>> z = zipfile.ZipFile("test2.zip")
>>> z.printdir()
File Name                                             Modified             Size
file1.txt                                      2007-10-11 14:03:12           54
file2.txt                                      2007-10-11 14:03:32           37

The printdir() method of a zipfile works just like the function we wrote in the last article to print out the files in the archive. You can also check that the files contain the data we expect:


>>> print z.read("file1.txt")
File One Contents

"Testing, testing, one two three."

But what if we want to add files to an existing zip? It's simple enough, we just need to open the file in append mode. Opening an existing zip file in write mode will erase the zip, so be careful when you're using that mode.

Let's say theres a "file3.txt" with the following contents:


File Three Contents

1234567890

We add it to the zip we just made (test2.zip) with the following code:


>>> import zipfile
>>> z = zipfile.ZipFile("test2.zip", "a")
>>> z.printdir()
File Name                                             Modified             Size
file1.txt                                      2007-10-11 14:03:12           54
file2.txt                                      2007-10-11 14:03:32           37
>>> z.write("file3.txt")
>>> z.printdir()
File Name                                             Modified             Size
file1.txt                                      2007-10-11 14:03:12           54
file2.txt                                      2007-10-11 14:03:32           37
file3.txt                                      2007-10-16 14:25:46           32
>>> z.close()

Finally, you can write a program to extract zip files to disk in just a few lines. The following Python program extracts all zip files given as arguments to the current directory.


from zipfile import *
import sys

for zipname in sys.argv[1:]:
	z = ZipFile(zipname)
	for filename in z.namelist():
		outfile = file(filename, "w")
		outfile.write(z.read(filename))
		outfile.close()

In action, it looks like this:


$ ls
test2.zip  unzip.py
$ python unzip.py test2.zip 
$ ls
file1.txt  file2.txt  file3.txt  test2.zip  unzip.py
$ cat file1.txt 
File One Contents

"Testing, testing, one two three."

Be careful, this simple program will only work if the zip archive has a flat file structure, i.e. it contains no nested directories. If it does, you'll need to adjust the program to create the directories as it goes, but I'll leave that extension up to you.

Editor's Picks

Free Newsletters, In your Inbox