471,089 Members | 1,564 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,089 software developers and data experts.

can tarfile maintain directory structure?

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 :(
Jul 18 '05 #1
8 10726
[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.

--
François Pinard http://www.iro.umontreal.ca/~pinard
Jul 18 '05 #2
"Jay Donnell" <ja********@yahoo.com> wrote in message
news:a6**************************@posting.google.c om...
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
Jul 18 '05 #3
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)

iD8DBQFBIrm1Jd01MZaTXX0RAmjCAKCpkTSIzUwPrrEbNOAZGe QAJ1TZlACgob8E
QGka1Q/r08XFFKnUcY+lJMo=
=A2fD
-----END PGP SIGNATURE-----

Jul 18 '05 #4
On Tue, 17 Aug 2004 21:06:45 -0500, Jeff Epler wrote:
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

--
Lars Gustäbel
la**@gustaebel.de

Jul 18 '05 #5
> 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.
Jul 18 '05 #6
At some point, ja********@yahoo.com (Jay Donnell) wrote:
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).


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

--
|>|\/|<
/--------------------------------------------------------------------------\
|David M. Cooke
|cookedm(at)physics(dot)mcmaster(dot)ca
Jul 18 '05 #7
On Wed, 18 Aug 2004 15:13:29 -0400, David M. Cooke wrote:

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

There was a bug report relating to tarfile & WinZip:
http://sourceforge.net/tracker/?grou...ail&aid=949052

Looks like it was closed today.

regards,
Richard
Jul 18 '05 #8
> > import tarfile

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


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.
Jul 18 '05 #9

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

4 posts views Thread by shane | last post: by
8 posts views Thread by James Owens | last post: by
1 post views Thread by soni29 | last post: by
4 posts views Thread by Elmo Watson | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.