can tarfile maintain directory structure?

J

Jay Donnell

Is there a way to use the tarfile module to recursively compress the
contents of a directory and maintain the directory structure in the
tar archive?

Simply doing os.system('tar -czvf ' + fileName +'.tar.gz ' +
directory)
works great on linux, but I need this script to work on windows as
well :(
 
?

=?iso-8859-1?Q?Fran=E7ois?= Pinard

[Jay Donnell]
Simply doing os.system('tar -czvf ' + fileName +'.tar.gz ' +
directory) works great on linux, but I need this script to work on
windows as well :(

GNU tar, and surely others, have been ported to Windows. Check within
the DJGPP and Cygwin projects.
 
A

Adonis

Jay Donnell said:
Is there a way to use the tarfile module to recursively compress the
contents of a directory and maintain the directory structure in the
tar archive?

Simply doing os.system('tar -czvf ' + fileName +'.tar.gz ' +
directory)
works great on linux, but I need this script to work on windows as
well :(

Starting from Python 2.3 there is a tarfile module in the stdlib
http://docs.python.org/lib/module-tarfile.html

Adonis
 
J

Jeff Epler

You can use os.walk (or os.path.walk for older versions of Python) to
recurse a directory tree. Here's a simple script to use tarfile and
os.walk:

import tarfile, sys, os

t = tarfile.TarFile(sys.argv[1], "w")
for f in sys.argv[2:]:
for dirpath, dirnames, filenames in os.walk(f):
for f in filenames:
f = os.path.join(dirpath, f)
print "Adding", f
t.add(f)

t.close()

Here's a sample session with it:
* Creating a simple directory structure
$ mkdir a
$ touch a/file.txt
$ mkdir a/subdir
$ touch a/subdir/subfile.txt

* Invoking the script
$ python ~/mktar.py test.tar a
Adding a/file.txt
Adding a/subdir/subfile .txt

* Checking on the results
$ tar tvf test.tar
-rw-rw-r-- jepler/jepler 0 2004-08-17 21:00:57 a/file.txt
-rw-rw-r-- jepler/jepler 0 2004-08-17 21:01:03 a/subdir/subfile.txt

I suspect that to get compressed output would involve use of gzip.open
and the 3-argument TarFile constructor, something like
import gzip
g = gzip.open(sys.argv[1], "w")
t = tarfile.TarFile(sys.argv[1], "w", g)
...
indeed, this seems to work for me.
$ python ~/mktargz.py test.tar.gz a
Adding a/file.txt
Adding a/subdir/subfile.txt
$ file test.tar.gz
test.tar.gz: gzip compressed data, was "test.tar", max compression

Jeff

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (GNU/Linux)

iD8DBQFBIrm1Jd01MZaTXX0RAmjCAKCpkTSIzUwPrrEbNOAZGeQAJ1TZlACgob8E
QGka1Q/r08XFFKnUcY+lJMo=
=A2fD
-----END PGP SIGNATURE-----
 
L

Lars Gustaebel

You can use os.walk (or os.path.walk for older versions of Python) to
recurse a directory tree. Here's a simple script to use tarfile and
os.walk:
[snip]

Far too complicated... tarfile.py is rather high-level:

import tarfile

tar = tarfile.open(filename, "w:gz")
tar.add(directory)
tar.close()

The add() method is recursive by default. More information and examples
here: http://docs.python.org/lib/module-tarfile.html
 
J

Jay Donnell

import tarfile
tar = tarfile.open(filename, "w:gz")
tar.add(directory)
tar.close()

The add() method is recursive by default. More information and examples
here: http://docs.python.org/lib/module-tarfile.html

That doesn't maintain the directory structure. When you untar it all
the files are in the base directory (when I untar it on windows with
winzip).

I haven't tried jeff's suggestion yet, but I'll let ya'll know how
that goes.
 
D

David M. Cooke

At said:
That doesn't maintain the directory structure. When you untar it all
the files are in the base directory (when I untar it on windows with
winzip).

Winzip is probably broken? It works for me using GNU tar on Linux.
 
J

Jay Donnell

import tarfile
This works perfectly on linux, but it wasn't working for me on windows
yesterday. I'll try it again the next time I'm on windows.
 

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
474,202
Messages
2,571,057
Members
47,667
Latest member
DaniloB294

Latest Threads

Top